如何基于Pandas另一列的值替换指定列的数值
Pandas按条件修改DataFrame列值的实现方案
原始数据与需求
原始DataFrame定义
import pandas as pd import numpy as np data = { 'id' : [1, 2, 3, 4], 'name' : ['Foo', 'Bar', 'Baz', 'Buzz'], 'symbol' : ['F', '.', 'Mx2', 'M'] } df = pd.DataFrame(data)
原始输出:
id name symbol 0 1 Foo F 1 2 Bar . 2 3 Baz Mx2 3 4 Buzz M
修改规则
需要按以下规则修改symbol列的值:
- 当
name等于Bar且symbol等于.时,将symbol改为F - 当
name等于Baz且symbol等于Mx2时,将symbol改为M
期望结果
id name symbol 0 1 Foo F 1 2 Bar F 2 3 Baz M 3 4 Buzz M
实现方法
方法一:loc条件定位赋值
这是最直观的方式,通过布尔条件精准定位目标行,直接修改对应列的值:
# 处理第一个规则 df.loc[(df['name'] == 'Bar') & (df['symbol'] == '.'), 'symbol'] = 'F' # 处理第二个规则 df.loc[(df['name'] == 'Baz') & (df['symbol'] == 'Mx2'), 'symbol'] = 'M'
方法二:嵌套np.where处理多条件
适合多分支条件场景,代码紧凑清晰:
df['symbol'] = np.where( (df['name'] == 'Bar') & (df['symbol'] == '.'), 'F', np.where( (df['name'] == 'Baz') & (df['symbol'] == 'Mx2'), 'M', df['symbol'] ) )
方法三:掩码+replace组合
如果后续规则扩展较多,这种方式更易维护:
# 定义两个条件掩码 mask_bar = (df['name'] == 'Bar') & (df['symbol'] == '.') mask_baz = (df['name'] == 'Baz') & (df['symbol'] == 'Mx2') # 按掩码替换对应值 df.loc[mask_bar, 'symbol'] = df.loc[mask_bar, 'symbol'].replace('.', 'F') df.loc[mask_baz, 'symbol'] = df.loc[mask_baz, 'symbol'].replace('Mx2', 'M')
内容的提问来源于stack exchange,提问作者zeroes_ones
相关产品推荐
相关产品推荐

