You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 13:00:01