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

在Python中基于前一行数据修改DataFrame列值

问题描述

我有如下结构的DataFrame:

NameOrder
Manufacturer0
Company11
product2
Company21
product2
product2
product2

其中Order列代表层级:

  • 0:制造商(Manufacturer)
  • 1:公司
  • 2:产品

需要新增Desired_Output列,生成规则:

  • Order为0的行:直接输出自身Name
  • Order为1的行:关联最近的Order=0的Name,格式为[制造商名称]_[公司名称]
  • Order为2的行:关联最近的Order=1的Name,格式为[公司名称]_[产品名称]

期望输出如下:

NameOrderDesired_Output
Manufacturer0Manufacturer
Company11Manufacturer_Company1
product2Company1_product
Company21Manufacturer_Company2
product2Company2_product
product2Company2_product
product2Company2_product
解决方案

可以用Pandas的ffill()(向前填充)方法,先为不同层级创建对应的关联列,再拼接生成结果:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'Name': ['Manufacturer', 'Company1', 'product', 'Company2', 'product', 'product', 'product'],
    'Order': [0, 1, 2, 1, 2, 2, 2]
})

# 生成制造商关联列:仅Order=0的行保留Name,其余为空,然后向前填充
df['manufacturer'] = df.loc[df['Order'] == 0, 'Name'].ffill()
# 生成公司关联列:仅Order=1的行保留Name,其余为空,然后向前填充
df['company'] = df.loc[df['Order'] == 1, 'Name'].ffill()

# 根据Order值生成Desired_Output
def generate_output(row):
    if row['Order'] == 0:
        return row['Name']
    elif row['Order'] == 1:
        return f"{row['manufacturer']}_{row['Name']}"
    elif row['Order'] == 2:
        return f"{row['company']}_{row['Name']}"

df['Desired_Output'] = df.apply(generate_output, axis=1)

# 可选:删除中间辅助列
df = df.drop(['manufacturer', 'company'], axis=1)

print(df)

代码说明

  1. 构造关联列:
    • manufacturer列:仅保留Order=0的Name值,其余行设为NaN,通过ffill()向前填充,确保后续所有行都能获取最近的制造商名称。
    • company列:同理,仅保留Order=1的Name值,向前填充后,所有产品行都能关联到最近的公司名称。
  2. 生成目标列:
    • 用apply()遍历每行,根据Order值匹配对应的拼接逻辑,生成最终的输出内容。
  3. 清理辅助列:如果不需要中间的manufacturer和company列,可执行删除操作。

运行代码后即可得到符合要求的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:50:29