基于Make与Status复杂条件更新DataFrame的Type列值
解决方案:按品牌批量更新DataFrame的Type字段
原始数据
import pandas as pd df = pd.DataFrame([('Tesla','Model3', '-', 'Motor'), ('Tesla', 'ModelS', '-', 'MotorMD3'), ('Tesla', 'ModelX', '-', 'MotorMD3'), ('Tesla', 'ModelY', '-', 'Motor'), ('Jeep', 'Wrangler','Grouped','Engine'), ('Jeep', 'Compass', 'Grouped','EngineMD3'), ('Jeep', 'Patriot', 'Grouped','Engine'), ('Jeep', 'Cherokee','Grouped','Engine'), ('Ford', 'Mustang', 'Grouped','Engine'), ('Ford', 'F150', 'Grouped','Engine') ],columns=['Make','Model','Status','Type'])
需求说明
- 若某品牌(Make)的Status全为
Grouped,且该品牌下存在任意车型(Model)的Type为EngineMD3,则将该品牌下所有车型的Type统一更新为EngineMD3 - 若车型Status不为
Grouped,Type保持原始值不变 - 若品牌Status为
Grouped但无EngineMD3车型,Type保持为Engine
实现方案
方案1:分组自定义函数处理
通过groupby按品牌分组,针对每个分组单独判断条件并更新:
def update_type_group(group): # 检查当前品牌所有车型的Status是否均为Grouped if group['Status'].eq('Grouped').all(): # 检查组内是否存在EngineMD3类型 if (group['Type'] == 'EngineMD3').any(): group['Type'] = 'EngineMD3' return group # 应用分组处理逻辑 df_updated = df.groupby('Make', group_keys=False).apply(update_type_group)
方案2:简洁版transform标记更新
利用transform生成每行的匹配标记,直接批量更新:
# 生成需要更新的行标记:Status为Grouped,且所属品牌存在EngineMD3车型 update_mask = (df['Status'] == 'Grouped') & df.groupby('Make')['Type'].transform(lambda x: (x == 'EngineMD3').any()) # 批量更新符合条件的行 df.loc[update_mask, 'Type'] = 'EngineMD3'
处理后结果
| Make | Model | Status | Type |
|---|---|---|---|
| Tesla | Model3 | - | Motor |
| Tesla | ModelS | - | MotorMD3 |
| Tesla | ModelX | - | MotorMD3 |
| Tesla | ModelY | - | Motor |
| Jeep | Wrangler | Grouped | EngineMD3 |
| Jeep | Compass | Grouped | EngineMD3 |
| Jeep | Patriot | Grouped | EngineMD3 |
| Jeep | Cherokee | Grouped | EngineMD3 |
| Ford | Mustang | Grouped | Engine |
| Ford | F150 | Grouped | Engine |
内容的提问来源于stack exchange,提问作者user18562240
相关产品推荐
相关产品推荐

