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

如何基于多复杂条件在Pandas中更新DataFrame的Type列

问题与解决方案

原始数据

import pandas as pd

df = pd.DataFrame([('Tesla','Model3', '-', 'Tesla'),
                  ('Tesla', 'ModelS', '-', 'Tesla_MD3'),
                  ('Tesla', 'ModelX', '-', 'Tesla_MD3'),
                  ('Tesla', 'ModelY', '-', 'Tesla'),
                  ('Jeep',  'Wrangler','Grouped','Jeep'),
                  ('Jeep',  'Compass', 'Grouped','Jeep_MD3'),
                  ('Jeep',  'Patriot', 'Grouped','Jeep'),
                  ('Jeep',  'Cherokee','Grouped','Jeep'),
                  ('Ford',  'Mustang', 'Grouped','Ford'),
                  ('Ford',  'F150',     'Grouped','Ford')  ],columns=['Make','Model','Status','Type'])

需求说明

  • 若某一Make的Status为Grouped,且该Make下存在Type为{Make}_MD3的行,则将该Make下所有Status为Grouped的行的Type更新为{Make}_MD3;
  • 若Status不为Grouped,则各行保持原有Type;
  • 若Status为Grouped但该Make下无{Make}_MD3的Type,则Type保持为Make。

用户尝试的错误代码

df.loc[df.Status.eq('Grouped'), 'Type'] = df[df.Status.eq('Grouped')].groupby('Make').Type.transform(
    lambda x: f"{x.str.replace('_MD3','')}_{MD3}" if x.str.contains('_MD3').any() else x)

错误原因

  1. 未定义变量MD3,应使用字符串常量'MD3';
  2. 逻辑偏差:不需要对每行的Type做替换,而是要基于Make生成统一的目标Type;
  3. 未处理“无对应_MD3类型时将Type设为Make”的规则,比如Ford的F150原有Type为Engine,需要修正为Ford。

正确实现方案

方案一:分步处理

# 筛选出符合条件的Make:Status为Grouped且存在{Make}_MD3的Type
valid_makes = df[df['Status'] == 'Grouped'].groupby('Make').filter(
    lambda g: f"{g.name}_MD3" in g['Type'].tolist()
)['Make'].unique()

# 批量更新符合条件的行的Type
df.loc[
    (df['Status'] == 'Grouped') & (df['Make'].isin(valid_makes)),
    'Type'
] = df['Make'] + '_MD3'

# 更新不符合条件的Grouped行的Type为Make
df.loc[
    (df['Status'] == 'Grouped') & (~df['Make'].isin(valid_makes)),
    'Type'
] = df['Make']

方案二:使用transform简化代码

def adjust_type(group):
    make_name = group.name
    target = f"{make_name}_MD3"
    if target in group['Type'].values:
        return [target] * len(group)
    return [make_name] * len(group)

# 仅对Status为Grouped的行应用规则
mask = df['Status'] == 'Grouped'
df.loc[mask, 'Type'] = df[mask].groupby('Make')['Type'].transform(adjust_type)

验证结果

执行代码后,输出符合预期:

Make    Model    Status       Type
0   Tesla   Model3      -           Tesla
1   Tesla   ModelS      -         Tesla_MD3
2   Tesla   ModelX      -         Tesla_MD3
3   Tesla   ModelY      -            Tesla
4   Jeep    Wrangler   Grouped     Jeep_MD3
5   Jeep    Compass    Grouped     Jeep_MD3
6   Jeep    Patriot    Grouped     Jeep_MD3
7   Jeep    Cherokee   Grouped     Jeep_MD3
8   Ford    Mustang    Grouped        Ford
9   Ford    F150       Grouped        Ford

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:05:30