gpt4 book ai didi

python - Pandas groupby 结果分为多列

转载 作者:太空狗 更新时间:2023-10-29 21:33:56 50 4
gpt4 key购买 nike

我有一个数据框,我希望在其中对组内的值进行分组,然后将其划分为多个列。

例如:假设我有以下数据框:

>>> import pandas as pd
>>> import numpy as np
>>> df=pd.DataFrame()
>>> df['Group']=['A','C','B','A','C','C']
>>> df['ID']=[1,2,3,4,5,6]
>>> df['Value']=np.random.randint(1,100,6)
>>> df
Group ID Value
0 A 1 66
1 C 2 2
2 B 3 98
3 A 4 90
4 C 5 85
5 C 6 38
>>>

我想对“组”字段进行分组,获取“值”字段的总和,并获取新字段,每个字段都包含组的 ID 值。

目前我可以按如下方式执行此操作,但我正在寻找一种更简洁的方法:

首先,我创建了一个数据框,其中包含每个组中的 ID 列表。

>>> g=df.groupby('Group')
>>> result=g.agg({'Value':np.sum, 'ID':lambda x:x.tolist()})
>>> result
ID Value
Group
A [1, 4] 98
B [3] 76
C [2, 5, 6] 204
>>>

然后我使用 pd.Series 将它们拆分成列,重命名它们,然后再将它们连接回去。

>>> id_df=result.ID.apply(lambda x:pd.Series(x))
>>> id_cols=['ID'+str(x) for x in range(1,len(id_df.columns)+1)]
>>> id_df.columns=id_cols
>>>
>>> result.join(id_df)[id_cols+['Value']]
ID1 ID2 ID3 Value
Group
A 1 4 NaN 98
B 3 NaN NaN 76
C 2 5 6 204
>>>

有没有一种无需先创建值列表即可执行此操作的方法?

最佳答案

你可以使用

id_df = grouped['ID'].apply(lambda x: pd.Series(x.values)).unstack()

在没有中间 result DataFrame 的情况下创建 id_df


import pandas as pd
import numpy as np
np.random.seed(2016)

df = pd.DataFrame({'Group': ['A', 'C', 'B', 'A', 'C', 'C'],
'ID': [1, 2, 3, 4, 5, 6],
'Value': np.random.randint(1, 100, 6)})

grouped = df.groupby('Group')
values = grouped['Value'].agg('sum')
id_df = grouped['ID'].apply(lambda x: pd.Series(x.values)).unstack()
id_df = id_df.rename(columns={i: 'ID{}'.format(i + 1) for i in range(id_df.shape[1])})
result = pd.concat([id_df, values], axis=1)
print(result)

产量

       ID1  ID2  ID3  Value
Group
A 1 4 NaN 77
B 3 NaN NaN 84
C 2 5 6 86

关于python - Pandas groupby 结果分为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35024023/

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