2017-04-24 7 views
2

繰り返す行のデータフレームを再形成したい。データは、データのブロックが繰り返されるcsvファイルから取得されます。一例として、繰り返し行を再形成するパンダ

:あなたがこれを行うにはどのように何か提案はありますか

Name  1st 2nd 3rd 4th 
Value1 a1 b1 a4 b4 
Value2 a2 b2 a5 b5 
Value3 a3 b3 a6 b6 

Name  1st 2nd 
0 Value1  a1  b1 
1 Value2  a2  b2 
2 Value3  a3  b3 
3 Value1  a4  b4 
4 Value2  a5  b5 
5 Value3  a6  b6 

はに再形成されなければなりませんか? 私はすでにこのthreadを見てきましたが、このアプローチを自分の問題に変換する方法がわかりません。この問題は、groupbyが働いている列の列が複数ある場合に起こります。

あなたが整形を行うには、新しい列のラベルを取得するには1、 cumcountにあなたの2つの列を結合する set_indexstackを使用し、 pivotでき

答えて

3

# Stack the 1st and 2nd columns, and use cumcount to get the new column labels. 
df = df.set_index('Name').stack().reset_index(level=1, drop=True).to_frame() 
df['new_col'] = df.groupby(level='Name').cumcount() 

# Perform a pivot to get the desired shape. 
df = df.pivot(columns='new_col', values=0) 

# Formatting. 
df = df.reset_index().rename_axis(None, 1) 

結果の出力:

 Name 0 1 2 3 
0 Value1 a1 b1 a4 b4 
1 Value2 a2 b2 a5 b5 
2 Value3 a3 b3 a6 b6 
1

名前でグループ化した後にdfの値が繰り返されたデータフレームを作成し、そのdfを元のデータとマージします。あなたは

Name 1st 2nd 3rd 4th 
0 Value1 a1 b1 a4 b4 
1 Value2 a2 b2 a5 b5 
2 Value3 a3 b3 a6 b6 
を取得

df1 = df.groupby('Name')['1st', '2nd'].apply(lambda x: x.iloc[1]).reset_index() 
df1.columns = ['Name', '3rd', '4th'] 
df = df.drop_duplicates(subset=['Name']).merge(df1, on = 'Name') 

関連する問題