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

例如:说我有以下数据框:

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

我想对“Group”字段进行分组,获取“Value”字段的总和,并获取新字段,每个字段都包含该组的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()

创建没有中间id_df DataFrame的result
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 分组比分为多列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35024023/

10-12 21:15