Pandas DataFrame中score1、score2列整数替换失效问题求助
问题原因分析
你遇到的问题核心是对pandas replace() 方法的工作逻辑理解有误:当你传入两个列表作为to_replace和value参数时,它不是按位置一一对应替换元素,而是按值建立映射关系。
比如你的代码中:
df['score1'].replace([33, 48, 25, 33], [1,2,3,4], inplace=True)
pandas会把to_replace列表中的每个值,映射到value列表对应位置的值,但如果to_replace里有重复值(比如两次出现的33),后面的映射会覆盖前面的。最终实际生效的映射是:
- 33 → 4(因为最后一次出现的33对应value里的4)
- 48 → 2
- 25 → 3
这就导致所有33都被替换成4,和你预期的“第一个33换1,第四个33换4”完全不符,看起来像是出现了“随机数值”。
解决方案
根据你的需求,分两种场景给出解决方法:
场景1:按值统一替换(所有相同值换成同一个新值)
如果你想把所有33替换成1、所有48替换成2、所有25替换成3,应该用字典映射的方式,这是replace()处理值替换的标准用法:
# 替换score1:所有33→1,48→2,25→3 df['score1'].replace({33: 1, 48: 2, 25: 3}, inplace=True) # 替换score2:所有33→1,48→3(注意你原代码里的重复值会被覆盖,这里按你可能的真实需求调整) df['score2'].replace({33: 1, 48: 3}, inplace=True)
场景2:按位置逐个替换(指定位置的元素换成对应新值)
如果你确实想按列中元素的位置,把第1个元素换1、第2个换2、第3个换3、第4个换4,那就不能用replace(),而是直接通过索引赋值:
# 按位置替换score1的所有元素 df['score1'].iloc[:] = [1, 2, 3, 4] # 按位置替换score2的所有元素 df['score2'].iloc[:] = [1, 3, 4, 5]
或者用更明确的行索引赋值(因为你的DataFrame行索引是a,b,d,e):
df.loc[['a', 'b', 'd', 'e'], 'score1'] = [1, 2, 3, 4] df.loc[['a', 'b', 'd', 'e'], 'score2'] = [1, 3, 4, 5]
修改后的完整代码示例
如果你需要按位置替换的效果,完整代码如下:
import pandas as pd raw_data = { "city" : ["new york", "Sydney", "miami", "Rome"], "rank": ["1st", "2nd", "2", "3"], "score1": [33, 48, 25, 33], "score2": [33, 48,33, 48] } df = pd.DataFrame( raw_data, index=pd.Index(['a', 'b', 'd', 'e'], name='letter'), columns=pd.Index(['city', 'rank', 'score1', 'score2'], name='attributes') ) # 按位置替换 df['score1'].iloc[:] = [1, 2, 3, 4] df['score2'].iloc[:] = [1, 3, 4, 5] print(df)
执行后输出的结果就是你预期的按位置替换后的DataFrame:
attributes city rank score1 score2 letter a new york 1st 1 1 b Sydney 2nd 2 3 d miami 2 3 4 e Rome 3 4 5
内容的提问来源于stack exchange,提问作者anna livingston
相关产品推荐
相关产品推荐

