基于ID分组Pandas DataFrame,将含'H'的组risk列全改为'H'
解决Pandas按组批量修改列值的需求
嘿,这个需求我之前也碰到过,用Pandas可以很轻松搞定!核心思路就是先按ID分组判断是否存在'H',再把符合条件的组统一修改值。下面给你两个实用的实现方法:
方法一:用groupby + transform(最简洁直接)
这个方法一步到位,transform会自动把分组的计算结果映射回原DataFrame的每一行,不用额外处理索引:
import pandas as pd # 构造你的原始DataFrame data = { 'ID': [1111,1111,1111,1111,1112,1112,1113,1113,1113,1113,1113,1114,1114,1114,1114], 'risk': ['H','H','L','L','L','L','H','L','H','H','H','L','L','L','L'] } df = pd.DataFrame(data) # 核心逻辑:按ID分组,组内有'H'则整组risk设为'H',否则保留原值 df['risk'] = df.groupby('ID')['risk'].transform(lambda x: 'H' if (x == 'H').any() else x) print(df)
方法二:用groupby + filter + loc(更灵活,适合后续复用ID列表)
如果之后你还需要用到那些包含'H'的ID列表,这个方法会更方便:
import pandas as pd data = { 'ID': [1111,1111,1111,1111,1112,1112,1113,1113,1113,1113,1113,1114,1114,1114,1114], 'risk': ['H','H','L','L','L','L','H','L','H','H','H','L','L','L','L'] } df = pd.DataFrame(data) # 第一步:筛选出所有包含'H'的ID has_h_ids = df.groupby('ID').filter(lambda x: (x['risk'] == 'H').any())['ID'].unique() # 第二步:把这些ID对应的所有行的risk改成'H' df.loc[df['ID'].isin(has_h_ids), 'risk'] = 'H' print(df)
最终期望输出
两种方法都会得到你想要的结果:
ID risk0 1111 H
1 1111 H
2 1111 H
3 1111 H
4 1112 L
5 1112 L
6 1113 H
7 1113 H
8 1113 H
9 1113 H
10 1113 H
11 1114 L
12 1114 L
13 1114 L
14 1114 L
内容的提问来源于stack exchange,提问作者HT121
相关产品推荐
相关产品推荐

