Pandas分组后DataFrame索引重命名仅前3行生效的解决方法求助
问题描述
我通过以下代码对现有表格进行分组聚合:
df.groupby('bin_fare')['fare'].agg(['count', 'sum', 'mean'])
得到的结果中,索引名为bin_fare,具体数据如下:
| bin_fare | count | sum | mean |
|---|---|---|---|
| 1 | 491 | 3717.1413 | 7.570553 |
| 2 | 474 | 9000.3078 | 18.987991 |
| 3 | 259 | 14565.0003 | 14565.0003 |
| 4 | 84 | 16268.0375 | 16268.0375 |
我尝试用以下代码重命名索引:
fare_rate_names = ['cheapest','avarage','above average','expensive'] df.groupby('bin_fare')['fare'].agg(['count','sum','mean']).rename(index=pd.Series(data=fare_rate_names))
但仅前3行索引被重命名,第4行仍为原索引值4,如何在不修改fare_rate_names开头元素的前提下解决该问题?
解决方法
出现该问题的核心原因是:用pd.Series传递新索引时,Series默认索引是从0开始的整数,而原分组结果的索引是1、2、3、4,两者无法完全匹配——前3个新值对应Series的0、1、2索引,刚好能对应原结果的1、2、3索引,但原结果的4号索引找不到Series中对应的值,因此保留了原索引。
以下两种方法都无需修改fare_rate_names的内容,可彻底解决问题:
方法1:用字典精准映射原索引与新名称
直接创建原索引值到新名称的映射字典,确保每个原索引都能匹配到对应的新名称:
fare_rate_names = ['cheapest','avarage','above average','expensive'] # 先获取分组聚合结果 result = df.groupby('bin_fare')['fare'].agg(['count','sum','mean']) # 用字典映射完成索引重命名 result.rename(index=dict(zip(result.index, fare_rate_names)), inplace=True)
方法2:直接替换索引属性
由于新名称的顺序和原索引的顺序完全对应,直接赋值给结果的index属性是最简洁的方式:
fare_rate_names = ['cheapest','avarage','above average','expensive'] result = df.groupby('bin_fare')['fare'].agg(['count','sum','mean']) result.index = fare_rate_names
内容的提问来源于stack exchange,提问作者Alexey Konev
相关产品推荐
相关产品推荐

