当DataFrame中两列值相等时用0替换指定列值的实现需求
解决方案
方法1:布尔索引(推荐,高效)
直接通过布尔条件定位目标行,批量修改Marks2的值,适合处理大规模数据集:
import pandas as pd # 初始化原始DataFrame df1 = pd.DataFrame({'Name1':['A','B','A','B','B','C','C','C','E','E','E'], 'Name2':['A','B','D','C','D','D','A','B','A','B','C'], 'Marks2':['Nan','Nan',6,50, 88,'Nan',140,9,'Nan',65,70]}) # 定位Name1与Name2相等的行,将对应Marks2设为'0' df1.loc[df1['Name1'] == df1['Name2'], 'Marks2'] = '0' # 可选:将Marks2转为数值类型(把字符串'Nan'转为真正的NaN,方便后续数值计算) df1['Marks2'] = pd.to_numeric(df1['Marks2'], errors='coerce') print(df1)
方法2:apply逐行判断
如果需要更灵活的行级逻辑处理,可以用apply遍历每一行:
import pandas as pd df1 = pd.DataFrame({'Name1':['A','B','A','B','B','C','C','C','E','E','E'], 'Name2':['A','B','D','C','D','D','A','B','A','B','C'], 'Marks2':['Nan','Nan',6,50, 88,'Nan',140,9,'Nan',65,70]}) # 逐行判断并替换值 df1['Marks2'] = df1.apply(lambda row: '0' if row['Name1'] == row['Name2'] else row['Marks2'], axis=1) # 可选转换数值类型 df1['Marks2'] = pd.to_numeric(df1['Marks2'], errors='coerce') print(df1)
最终结果
执行代码后得到的DataFrame如下:
| Name1 | Name2 | Marks2 | |
|---|---|---|---|
| 0 | A | A | 0.0 |
| 1 | B | B | 0.0 |
| 2 | A | D | 6.0 |
| 3 | B | C | 50.0 |
| 4 | B | D | 88.0 |
| 5 | C | D | NaN |
| 6 | C | A | 140.0 |
| 7 | C | B | 9.0 |
| 8 | E | A | NaN |
| 9 | E | B | 65.0 |
| 10 | E | C | 70.0 |
说明
- 原始
Marks2列存储的是字符串(含'Nan'字符串),如果不需要数值计算,可以跳过pd.to_numeric步骤,此时替换后的0为字符串类型。 - 布尔索引方法的执行效率远高于
apply,优先推荐使用。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

