Python支持透视和贴图值

Python支持透视和贴图值,python,pandas,join,dataframe,pivot,Python,Pandas,Join,Dataframe,Pivot,假设我有一个dataframe,它有以下列:id1、id2、valueType、value 首先,我希望将数据帧旋转,以便为不同的可能值类型(valueType.unique()?)追加列。然后,对于每个值,我希望将其映射到行中具有相应id1、id2的正确valueType列中。我想我还必须考虑到这样一个事实,即新的数据透视列的长度不一定相等(即某些valueType比其他类型出现得更频繁),因此我必须在之前用NaN填充它们。最好的方法是什么?我猜我会在数据帧上使用pivot()和set_ind

假设我有一个dataframe,它有以下列: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

使用透视表

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

使用透视表

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

在提问之前最好先在谷歌上搜索你的问题:)在提问之前最好先在谷歌上搜索你的问题:)