2017-01-24 8 views
2

私は、Pythonでpandasを初めて使っています。私はこれに関する助けに感謝します。私はグーグルとグーグルではありますが、それを解読することはできません。パンダでは、行グループをどのように平坦化するのですか?

たとえば、私は6列のcsvファイルを持っています。私は各行のすべてのデータが1つの行に平坦化されるように行をグループ化しようとしています。だから、

私のデータは次のように見える場合:

event event_date event_time name height age 1 2015-05-06 14:00 J Bloggs 185 24 1 2015-05-06 14:00 P Smith 176 55 1 2015-05-06 14:00 T Kirk 193 22 2 2015-05-14 17:00 B Gates 178 72 2 2015-05-14 17:00 J Mayer 184 42

と私はそれで終わりにしたいあなたが最初のイベントの上に見ることができるように、この

event event_date event_time name_1  height_1 age_1 name_2  height_2 age_2 name_3 height_3 age_3           
1  2015-05-06 14:00   J Bloggs 185  24  P Smith 176  55  T Kirk 193  22           
2  2015-05-14 17:00   B Gates 178  72  J Mayer 184  42 
                                              .   

のように平らに最初の3行は1つに平坦化され、列データは行データに対応するように展開されます。 2番目のイベントは平坦化され、列はデータで埋められます。

何か助けが得られるでしょう。

+0

ない私が正しく理解し、多分あなたは内部結合パンダを行うことができれば必ず?たぶん、pd.merge(df、df、on = 'イベント'、how = 'inner')を使用し、後でdrop_duplicatesを使用してください。 – Guido

答えて

7

ステップ:

1)GROUPBYオブジェクトの累積数を計算します。 1を追加して、ヘッダーが希望のとおりにフォーマットされるようにします。DF

2)インデックス軸と同じグループ化された列を、計算されたcumcountsと一緒に設定し、次にunstackに設定します。さらに、最下位レベルに従ってヘッダーをソートします。

3)マルチインデックス列の名前を変更し、それに応じて平坦化して1つのヘッダーを取得します。


cc = df.groupby(['event','event_date','event_time']).cumcount() + 1 
df = df.set_index(['event','event_date','event_time', cc]).unstack().sort_index(1, level=1) 
df.columns = ['_'.join(map(str,i)) for i in df.columns] 
df.reset_index() 

enter image description here

+1

それは信じられないほど創造的です。よくできた –

+1

ありがとうNickil。これは素晴らしいことであり、うまくいきます。 – SpeedOfSpin

2

長いテーブルから広いテーブルを作る。通常、データ分析では逆のことをしたいと思います。ここでは、最初に各変数名、高さ、年齢の出現を数え、必要な方法でピボットする方法があります。

df['group_num'] = df.groupby(['event', 'event_date','event_time']).cumcount() + 1 
df = df.sort_values('group_num') 
df1 = df.set_index(['event', 'event_date','event_time', 'group_num']).stack().reset_index() 
df1['var_names'] = df1['level_4'] + '_' + df1['group_num'].astype(str) 
df1 = df1.drop(['group_num', 'level_4'], axis=1) 
df1.set_index(['event', 'event_date', 'event_time', 'var_names']).squeeze().unstack('var_names') 

var_names     age_1 age_2 age_3 height_1 height_2 height_3 \ 
event event_date event_time             
1  2015-05-06 14:00   24 55 22  185  176  193 
2  2015-05-14 17:00   72 42 None  178  184  None 

var_names      name_1 name_2 name_3 
event event_date event_time        
1  2015-05-06 14:00  J Bloggs P Smith T Kirk 
2  2015-05-14 17:00  B Gates J Mayer None 
+0

テッドありがとうございます。これはうまくいく。 – SpeedOfSpin

関連する問題