gpt4 book ai didi

python - 如何创建一个数据透视表,该数据透视表在包含重复条目的列上建立索引,这些重复条目应按另一列的值进行分组?

转载 作者:行者123 更新时间:2023-12-04 01:06:08 25 4
gpt4 key购买 nike

假设我有一个这样的数据框

import pandas as pd
df = pd.DataFrame({'key1': ['id1','id1','id1','id1','id2','id2','id2','id3'],
'key2': ['MIN','MIN','MAX','MAX','MIN','MIN','MAX','MIN'],
'key3': [0,1,0,1,0,2,1,0],
'value': [-1,-2,11,12,-4,0,9,-2]})

print(df)
key1 key2 key3 value
0 id1 MIN 0 -1
1 id1 MIN 1 -2
2 id1 MAX 0 11
3 id1 MAX 1 12
4 id2 MIN 0 -4
5 id2 MIN 2 0
6 id2 MAX 1 9
7 id3 MIN 0 -2

考虑到:

  • key1key2 列中的值都不唯一
  • key3 的值与我们的任务无关(因此我们可以根据需要对它们进行分组、聚合或过滤)

我想创建一个数据透视表,其中:

  • 索引具有key1的唯一值
  • 列是 key2 的唯一值(我们可以假设它们只是 MAX 和 MIN)
  • MAX 列中的值是原始数据帧中给定 key1 值的最大值,其中 key2=MAX
  • MIN 列中的值是原始数据帧中给定 key1 值的最小值,其中 key2=MIN

所以,对于给定的输入,输出应该是

      MIN  MAX 
id1 -2 12
id2 -4 9
id3 -2 NaN

如果我尝试在数据帧上使用 pivot 函数,我会得到一个 ValueError 因为 key1 有重复的值

df.pivot(index='key1', columns='key2', values='value')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-19-eee9e613bc28> in <module>
----> 1 df.pivot(index='key1', columns='key2', values='value')
2 # ValueError: Index contains duplicate entries, cannot reshape

而且我不能使用 groupby 函数,因为它会将 MIN 和 MAX 值聚合在一起

print(df.groupby('key1').agg(MIN=('value', 'min'), MAX=('value', 'max')))
MIN MAX
key1
id1 -2 12
id2 -4 9
id3 -2 -2

有没有比创建两个单独的系列(一个用于 MIN 值,一个用于 MAX 值;一般来说,key2 中的每个不同值都是一个系列)更优雅的解决方案?

min_series=df[df['key2'].eq('MIN')].groupby('key1').min()['value']
max_series=df[df['key2'].eq('MAX')].groupby('key1').max()['value']
print(pd.DataFrame({'MIN':min_series, 'MAX':max_series}))
MIN MAX
id1 -2 12.0
id2 -4 9.0
id3 -2 NaN

最佳答案

这是解决问题的一种方法,方法是将数据框分组到 key1key2 上,然后根据以下条件为每个子组聚合列 value key2指定的聚合函数:

d = {k: v.agg(k[1].lower()) for k, v in df.groupby(['key1', 'key2'])['value']}
frame = pd.Series(d).unstack()

>>> frame

MAX MIN
id1 12.0 -2.0
id2 9.0 -4.0
id3 NaN -2.0

关于python - 如何创建一个数据透视表,该数据透视表在包含重复条目的列上建立索引,这些重复条目应按另一列的值进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66399848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com