如何在Pandas中用多个值替换相同数据?现有方法失效求方案
问题:将DataFrame中重复的'High'替换为不同值('H'、'Hi')
原始DataFrame定义:
import pandas as pd df = pd.DataFrame({'names': ['Fenellas', 'Steve', 'Jo', 'Stephen', 'Lili'], 'grade': ['High', 'High', 'Low', 'High', 'Medium']})
用户尝试以下两种replace方法均未达到预期效果:
# 方法1:无法按预期分配多个替换值 df = df.replace(to_replace='High', value=['H','Hi']) # 方法2:仅替换第一个匹配项,剩余'High'未处理 df = df.replace(to_replace='High', value='H', limit=1)
期望最终输出:
names grade Fenellas H Steve Hi Jo Low Stephen Hi Lili Medium
可行解决方案
方法1:定位索引后批量赋值
先筛选出所有grade为High的行索引,再根据位置生成对应的替换值列表,最后直接赋值:
# 获取所有grade为High的行索引 high_rows = df[df['grade'] == 'High'].index # 生成替换值:第一个High替换为'H',其余替换为'Hi' replace_list = ['H'] + ['Hi'] * (len(high_rows) - 1) # 执行替换 df.loc[high_rows, 'grade'] = replace_list
方法2:利用分组计数动态替换
通过groupby.cumcount()统计每个High的出现顺序,再根据顺序分配替换值:
# 对grade列中等于'High'的项,按出现顺序替换 df['grade'] = df['grade'].mask( df['grade'] == 'High', df.groupby('grade').cumcount().map(lambda x: 'H' if x == 0 else 'Hi') )
原方法无效原因说明
- 第一种
replace用法中,当value传入列表时,to_replace需要是同长度的匹配列表或映射字典,无法直接将单个匹配值映射到多值循环分配。 - 第二种
replace的limit参数仅控制全局替换的总次数,默认按列处理,只会替换第一个High,剩余匹配项不会被替换。
内容的提问来源于stack exchange,提问作者Shakib
相关产品推荐
相关产品推荐

