在Python中基于前一行数据修改DataFrame列值
问题描述
我有如下结构的DataFrame:
| Name | Order |
|---|---|
| Manufacturer | 0 |
| Company1 | 1 |
| product | 2 |
| Company2 | 1 |
| product | 2 |
| product | 2 |
| product | 2 |
其中Order列代表层级:
- 0:制造商(Manufacturer)
- 1:公司
- 2:产品
需要新增Desired_Output列,生成规则:
- Order为0的行:直接输出自身Name
- Order为1的行:关联最近的Order=0的Name,格式为
[制造商名称]_[公司名称] - Order为2的行:关联最近的Order=1的Name,格式为
[公司名称]_[产品名称]
期望输出如下:
| Name | Order | Desired_Output |
|---|---|---|
| Manufacturer | 0 | Manufacturer |
| Company1 | 1 | Manufacturer_Company1 |
| product | 2 | Company1_product |
| Company2 | 1 | Manufacturer_Company2 |
| product | 2 | Company2_product |
| product | 2 | Company2_product |
| product | 2 | Company2_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)
代码说明
- 构造关联列:
manufacturer列:仅保留Order=0的Name值,其余行设为NaN,通过ffill()向前填充,确保后续所有行都能获取最近的制造商名称。company列:同理,仅保留Order=1的Name值,向前填充后,所有产品行都能关联到最近的公司名称。
- 生成目标列:
- 用
apply()遍历每行,根据Order值匹配对应的拼接逻辑,生成最终的输出内容。
- 用
- 清理辅助列:如果不需要中间的
manufacturer和company列,可执行删除操作。
运行代码后即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Gojoe
相关产品推荐
相关产品推荐

