如何修改Pandas中df.groupby输出的索引名称及优化计数方法
问题描述
我有一个pd.Series类型的df['target'],其中值为0代表malignant(恶性)、1代表benign(良性)。我希望统计两类值的数量,并将索引名改为'malignant'和'benign',得到索引为['malignant', 'benign']、名为target的长度为2的整数型Series,示例如下:
target malignant 212 benign 357
我尝试了以下代码:
target = df.groupby(['target']).size() target.rename(index={'0': 'malignant', '1': 'benign'})
但返回结果的索引名仍为0和1,如下所示:
target 0 212 1 357 dtype: int64
请问该如何解决?是否有比.size()更好的计数方法?
解决方案
1. 修复现有代码的问题
你的代码存在两个核心问题:
- 索引类型不匹配:如果
df['target']的取值是整数类型,groupby生成的索引也是整数0、1,你用字符串'0'、'1'去匹配自然不会生效,要改用整数作为映射键。 - 未接收返回值:
rename()默认返回新的Series对象,不会原地修改原变量,需要重新赋值给target,或者添加inplace=True参数实现原地修改。
修复后的代码:
target = df.groupby(['target']).size() # 方法一:重新赋值接收新对象 target = target.rename(index={0: 'malignant', 1: 'benign'}) # 方法二:原地修改原对象 # target.rename(index={0: 'malignant', 1: 'benign'}, inplace=True)
2. 更简洁的计数方法:value_counts()
pd.Series.value_counts()是专门用于统计值频次的方法,比groupby().size()更简洁直接,搭配rename即可完成需求:
# 基础用法 target = df['target'].value_counts().rename(index={0: 'malignant', 1: 'benign'}) # 若需要固定索引顺序为malignant在前,添加sort=False target = df['target'].value_counts(sort=False).rename(index={0: 'malignant', 1: 'benign'})
如果要严格保证索引顺序为['malignant', 'benign'],可以再配合reindex:
target = df['target'].value_counts()\ .rename(index={0: 'malignant', 1: 'benign'})\ .reindex(['malignant', 'benign'])
内容的提问来源于stack exchange,提问作者Jay Ji
相关产品推荐
相关产品推荐

