对于以下数据框:
df = pd.DataFrame({'group':['a','a','b','b'], 'data':[5,10,100,30]},columns=['group', 'data'])
print(df)
group data
0 a 5
1 a 10
2 b 100
3 b 30
按列分组,添加并创建新列时,结果为:
df['new'] = df.groupby('group')['data'].sum()
print(df)
group data new
0 a 5 NaN
1 a 10 NaN
2 b 100 NaN
3 b 30 NaN
但是,如果我们将df重置为原始数据并将group列移至索引,
df.set_index('group', inplace=True)
print(df)
data
group
a 5
a 10
b 100
b 30
然后进行分组和求和,然后得到:
df['new'] = df.groupby('group')['data'].sum()
print(df)
data new
group
a 5 15
a 10 15
b 100 130
b 30 130
为什么列组没有设置新列中的值,但是索引分组却设置了新列中的值?
答案 0 :(得分:4)
更好的方法是将GroupBy.transform
用于返回系列,其大小与原始DataFrame
相同,因此在分配所有正常工作后:
df['new'] = df.groupby('group')['data'].transform('sum')
因为分配新的Series值时按索引值对齐。如果索引不同,请获取NaN
:
print (df.groupby('group')['data'].sum())
group
a 15
b 130
Name: data, dtype: int64
不同的索引值-获得NaN:
print (df.groupby('group')['data'].sum().index)
Index(['a', 'b'], dtype='object', name='group')
print (df.index)
RangeIndex(start=0, stop=4, step=1)
df.set_index('group', inplace=True)
print (df.groupby('group')['data'].sum())
group
a 15
b 130
Name: data, dtype: int64
索引可以对齐,因为值匹配:
print (df.groupby('group')['data'].sum().index)
Index(['a', 'b'], dtype='object', name='group')
print (df.index)
Index(['a', 'a', 'b', 'b'], dtype='object', name='group')
答案 1 :(得分:2)
您没有得到想要的东西,因为使用df.groupby('group')['data'].sum()
时会返回以group
作为索引的汇总结果
group
a 15
b 130
Name: data, dtype: int64
显然索引未对齐的地方。
如果您希望此方法有效,则必须使用transform
,它会返回具有转换后的vales的Series,其具有与self相同的轴长:
df['new'] = df.groupby('group')['data'].transform('sum')
group data new
0 a 5 15
1 a 10 15
2 b 100 130
3 b 30 130