2017-09-08 10 views
0

私は、列があるデータフレームがあるとしましょう:id1、id2、valueType、value。Python Pandasピボットとマップの値

まず、データフレームをピボットして、さまざまな値タイプ(valueType.unique()?)の列を追加する必要があります。次に、それぞれの値に対して、対応するid1、id2を持つ行の正しいvalueType列にマップします。新しいピボット列の長さが必ずしも同じではない(つまり、一部のvalueTypeが他のものよりも頻繁に表示される)という事実を考慮する必要があるので、前にNaNでそれらの列を入力する必要があります。これには最高のアプローチは何ですか?私はピボット()とset_index()をデータフレームに使用すると思いますか?


入力df

id1 id2 valuetype value 
0  1 a height  5 
1  1 a  width  4 
2  1 a length  3 
3  1 b height  6 
4  1 b  width  5 
5  1 c length  4 
6  2 a height  3 
7  2 a  width  6 
8  2 b height  7 
9  2 b length  8 
10 2 c height  9 
11 2 c  width  5 

予想される出力

id1 id2 height length width 
0 1 a  5.0  3.0 4.0 
1 1 b  6.0  NaN 5.0 
2 1 c  NaN  4.0 NaN 
3 2 a  3.0  NaN 6.0 
4 2 b  7.0  8.0 NaN 
5 2 c  9.0  NaN 5.0 
+0

を使用.. :) – Wen

答えて

2

使用pivot_table

In [401]: (df.pivot_table(index=['id1', 'id2'], columns='valuetype', values='value') 
      .reset_index().rename_axis(None, 1)) 
Out[401]: 
    id1 id2 height length width 
0 1 a  5.0  3.0 4.0 
1 1 b  6.0  NaN 5.0 
2 1 c  NaN  4.0 NaN 
3 2 a  3.0  NaN 6.0 
4 2 b  7.0  8.0 NaN 
5 2 c  9.0  NaN 5.0 

あるいは、使用groupby

In [404]: (df.groupby(['id1', 'id2', 'valuetype'])['value'].sum().unstack() 
      .reset_index().rename_axis(None, 1)) 
Out[404]: 
    id1 id2 height length width 
0 1 a  5.0  3.0 4.0 
1 1 b  6.0  NaN 5.0 
2 1 c  NaN  4.0 NaN 
3 2 a  3.0  NaN 6.0 
4 2 b  7.0  8.0 NaN 
5 2 c  9.0  NaN 5.0 

それとも、それはより良い尋ねる前にGoogleであなたの質問を検索している​​

In [414]: (df.set_index(['id1', 'id2', 'valuetype'])['value'].unstack() 
      .reset_index().rename_axis(None, 1)) 
Out[414]: 
    id1 id2 height length width 
0 1 a  5.0  3.0 4.0 
1 1 b  6.0  NaN 5.0 
2 1 c  NaN  4.0 NaN 
3 2 a  3.0  NaN 6.0 
4 2 b  7.0  8.0 NaN 
5 2 c  9.0  NaN 5.0 
関連する問題