【问题标题】:Python Pandas pivot and map valuesPython Pandas 透视和映射值
【发布时间】:2017-09-09 02:15:24
【问题描述】:

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

首先,我想旋转数据框以附加不同可能值类型的列(valueType.unique() ?)。然后,对于每个值,我想将其映射到具有相应 id1、id2 的行的正确 valueType 列。我想我还必须考虑到新的旋转列的长度不一定相等(即某些 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

【问题讨论】:

  • 在问之前最好在谷歌搜索你的问题..:)

标签: python pandas join dataframe pivot


【解决方案1】:

使用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

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 2022-01-19
    • 2021-12-14
    • 2022-10-15
    • 2018-08-29
    • 1970-01-01
    • 2023-03-23
    • 2023-03-14
    相关资源
    最近更新 更多