如何将DataFrame前一行的surname值赋值给满足指定条件的当前行?
Pandas 字段填充实现方案
原代码问题说明
你的代码存在4处语法和逻辑错误,导致无法运行:
- 多条件布尔过滤不能使用Python原生
and运算符,需使用pandas支持的按位与运算符&,且每个条件要用小括号包裹,避免运算符优先级冲突 df[['message']] = '!'是赋值操作,判断字段相等需要用==;取单列用单中括号即可,双中括号返回的DataFrame类型不适合做逐行布尔判断shift(-1)是取下一行的值,你需要获取上一行的值应该用shift(1)df[[surname]]中的列名是字符串类型,需要加引号,否则会被识别为未定义变量触发报错
正确实现代码
因为你已经提前完成了全列排序,行顺序符合要求,可以直接使用以下代码:
# 构造满足条件的行掩码:surname为空且message等于'!' mask = (df['surname'].isna()) & (df['message'] == '!') # 对符合条件的行赋值为上一行的surname值 df.loc[mask, 'surname'] = df['surname'].shift(1).loc[mask]
如果存在连续多行都满足填充条件,可以用更简洁的ffill(前向填充)方法实现:
mask = (df['surname'].isna()) & (df['message'] == '!') df['surname'] = df['surname'].mask(mask, df['surname'].ffill())
效果验证示例
import pandas as pd # 构造测试数据 df = pd.DataFrame({ 'name': ['张', '李', '王', '赵'], 'surname': ['三', None, None, '四'], 'message': ['测试1', '!', '!', '测试2'], 'time': [1, 2, 3, 4] }) # 执行上述代码后,surname列结果为 ['三', '三', '三', '四']
内容的提问来源于stack exchange,提问作者user458
相关产品推荐
相关产品推荐

