如何基于多复杂条件在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)
错误原因
- 未定义变量
MD3,应使用字符串常量'MD3'; - 逻辑偏差:不需要对每行的
Type做替换,而是要基于Make生成统一的目标Type; - 未处理“无对应_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
相关产品推荐
相关产品推荐

