Python Pandas透视和映射值

时间:2017-09-08 18:01:47

标签: python pandas join dataframe pivot

假设我有一个包含列的数据框:id1,id2,valueType,value。

首先,我想转动数据框以附加不同可能值类型的列(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

1 个答案:

答案 0 :(得分: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

或者,使用set_index

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