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