2017-09-08 123 views
0

比方说,我有一个数据帧有列:id1,id2,valueType,值。Python熊猫枢轴和地图值

首先,我想要旋转数据框以追加不同可能的值类型(valueType.unique()?)的列。然后,对于每个值,我想将其映射到具有相应id1,id2的行的正确valueType列中。我想我也必须说明这样一个事实,即新的透视列的长度不一定相等(即某些valueType比其他值更常见),所以我必须先填入NaN。最好的办法是什么?我猜我会在数据框上使用pivot()和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 

或者,使用​​

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