分组总和,索引与列结果

时间:2019-05-17 09:01:13

标签: python pandas indexing group-by

对于以下数据框:

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

为什么列组没有设置新列中的值,但是索引分组却设置了新列中的值?

2 个答案:

答案 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
相关问题