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

基于Lev列值生成新列:Pandas DataFrame数据处理需求

问题描述

现有从Excel导入的DataFrame结构如下:

Lev.MaterialTextQTY
.1X222Model31
.24027721Gruoup11
.34647273Gruoup1.14
.3573828Gruoup1.21
.247883Gruoup21
.3573829Gruoup2.15
.3747458Gruoup2.24

需要新增一列NewColumn,规则如下:

  • 当Lev.列值为.1或.2时,取当前行Material列的值
  • 当Lev.为.3时,取NewColumn的上一行值

尝试了以下代码但未得到预期结果:

def categorise_row:   
 if df ["Lev"] == ".1" or ".2"
   df ["Material"] 
 else df.iloc[-1]["Material"] 
df ['ColF'] = df.apply (categorise_row)

期望的结果如下:

Lev.MaterialTextQTYNewColumn
.1X222Model31X222
.24027721Gruoup114027721
.34647273Gruoup1.144027721
.3573828Gruoup1.214027721
.247883Gruoup2147883
.3573829Gruoup2.1547883
.3747458Gruoup2.2447883
正确实现方法

方法1:利用mask和ffill(推荐,高效简洁)

直接用pandas内置方法实现,性能更优:

import pandas as pd

# 假设df是导入后的DataFrame
df['NewColumn'] = df['Material'].mask(df['Lev.'] == '.3')
df['NewColumn'] = df['NewColumn'].ffill()

原理:

  1. mask(df['Lev.'] == '.3')将Lev.为.3的行的NewColumn设为NaN
  2. ffill()(向前填充)把NaN替换为上一个非空有效值,完全匹配需求

方法2:自定义函数逐行处理

如果需要逐行逻辑控制,可使用以下代码:

last_val = None

def categorise_row(row):
    global last_val
    if row['Lev.'] in ['.1', '.2']:
        last_val = row['Material']
        return row['Material']
    else:
        return last_val

df['NewColumn'] = df.apply(categorise_row, axis=1)

注意:

  • 必须指定axis=1,让apply按行处理数据
  • 用全局变量last_val跟踪上一行的有效值
  • 条件判断用in ['.1', '.2']实现多值匹配

内容的提问来源于stack exchange,提问作者user19613662

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:45:37