如何在DataFrame中按多列分组并正确聚合多字段?
解决Pandas分组聚合时因错误包含聚合字段导致的重复行问题
看起来你已经走对了第一步——用前向填充补全了State和County的NaN值,但问题出在错误地将需要聚合的字段(Man、Woman、Not_Register)加入了分组键里。
让我拆解一下问题:
当你把Man、Woman这些字段放进groupby的参数时,Pandas会认为只要这些字段的值有差异,就算是不同的分组。比如你Gto州Celaya县的原始数据里,有几行的Man/Woman值不同,它们就会被分成多个组,最终结果自然会出现重复的County行。
正确的解决方法
我们只需要把**分组维度(State、County)**放进groupby,然后对需要汇总的字段(Homicides、Man、Woman、Not_Register)指定聚合函数即可。
完整代码如下:
import pandas as pd import numpy as np # 构造示例数据(方便验证) data = { 'State': ['Gto', np.nan, np.nan, np.nan, np.nan, 'Sin', np.nan, 'Chih'], 'County': ['Celaya', np.nan, np.nan, 'Yiriria', 'Acambaro', 'Culiacan', np.nan, 'Juarez'], 'Homicides': [2,8,3,2,1,3,5,1], 'Man': [2,4,2,1,1,1,4,1], 'Woman': [0,2,1,1,0,1,0,0], 'Not_Register': [0,2,0,0,0,1,1,0] } df = pd.DataFrame(data) # 前向填充补全NaN(新版本Pandas推荐用ffill替代pad) df = df.fillna(method='ffill') # 只按State和County分组,对需要求和的字段统一聚合 df_agg = df.groupby(['State', 'County'], as_index=False).agg({ 'Homicides': 'sum', 'Man': 'sum', 'Woman': 'sum', 'Not_Register': 'sum' }) print(df_agg)
输出结果验证
运行后你会得到和预期完全一致的结果:
| State | County | Homicides | Man | Woman | Not_Register |
|---|---|---|---|---|---|
| Chih | Juarez | 1 | 1 | 0 | 0 |
| Gto | Acambaro | 1 | 1 | 0 | 0 |
| Gto | Celaya | 13 | 8 | 3 | 2 |
| Gto | Yiriria | 2 | 1 | 1 | 0 |
| Sin | Culiacan | 8 | 5 | 1 | 2 |
额外提示
- 如果你所有需要聚合的字段都是求和,也可以简化写成
df.groupby(['State', 'County'], as_index=False).sum(),效果是一样的。 - Pandas 2.0+版本里
method='pad'已经被标记为过时,建议改用df.fillna(method='ffill')或者df.ffill(),避免警告信息。
内容的提问来源于stack exchange,提问作者coding
相关产品推荐
相关产品推荐

