如何在Pandas中按组替换DataFrame的列值?
Pandas 按(Name, Thing)分组更新flag列
问题背景
输入DataFrame:
Name Thing type flag Steve Car High NULL Steve Car Low NULL Steve Bike Low NULL Steve Bike Avg X Steve Plane High NULL Steve Plane Low NULL
更新规则
- 针对每个(Name, Thing)分组:
- 若分组内同时存在
Low和Avg类型,将这两类行的flag设为X - 若分组内同时存在
High和Avg类型,将这两类行的flag设为X
- 若分组内同时存在
预期输出
Name Thing type flag Steve Car High NULL Steve Car Low NULL Steve Bike Low X Steve Bike Avg X Steve Plane High NULL Steve Plane Low NULL
已尝试的错误代码
df['flag'] = df['flag'].mask((df['type'] == 'Low') | (df['type'] == 'Avg'), 'X').groupby(df(['name','thing'])).transform('any')
正确实现方案
问题分析
原代码存在两处问题:
- 语法错误:
groupby(df(['name','thing']))应为groupby(['Name','Thing'])(注意列名大小写和索引语法) - 逻辑偏差:
transform('any')无法实现“分组满足条件才更新对应行”的需求,需先判断分组特征再针对性更新
代码实现
import pandas as pd # 构造输入数据(Pandas中用pd.NA表示空值) df = pd.DataFrame({ 'Name': ['Steve', 'Steve', 'Steve', 'Steve', 'Steve', 'Steve'], 'Thing': ['Car', 'Car', 'Bike', 'Bike', 'Plane', 'Plane'], 'type': ['High', 'Low', 'Low', 'Avg', 'High', 'Low'], 'flag': [pd.NA, pd.NA, pd.NA, 'X', pd.NA, pd.NA] }) def process_group(group): group_types = group['type'].unique() # 检查分组是否满足任一更新条件 has_low_avg = ('Low' in group_types) and ('Avg' in group_types) has_high_avg = ('High' in group_types) and ('Avg' in group_types) if has_low_avg: group.loc[group['type'].isin(['Low', 'Avg']), 'flag'] = 'X' if has_high_avg: group.loc[group['type'].isin(['High', 'Avg']), 'flag'] = 'X' return group # 按(Name, Thing)分组处理 df = df.groupby(['Name', 'Thing'], group_keys=False).apply(process_group) print(df)
代码说明
groupby(['Name', 'Thing']):按指定维度对数据分组- 自定义
process_group函数:对每个分组检查是否包含目标类型组合,再更新对应行的flag值 group_keys=False:避免分组键被添加为结果的额外列
运行结果
Name Thing type flag 0 Steve Car High <NA> 1 Steve Car Low <NA> 2 Steve Bike Low X 3 Steve Bike Avg X 4 Steve Plane High <NA> 5 Steve Plane Low <NA>
内容的提问来源于stack exchange,提问作者anagha s
相关产品推荐
相关产品推荐

