如何在Pandas Groupby中将含'Hat'的分组所有val值设为'Hat'
解决DataFrame分组替换值的问题
你已经找对了分组判断的思路,接下来只需要把符合条件的分组统一替换值就行。这里给你两种方案,一种是基于你现有循环逻辑的改进,另一种是更高效的Pandas原生向量化操作:
方案一:改进你的循环代码
你原来的循环里拿到了分组后的子DataFrame,但直接修改子DataFrame不会影响原数据,所以需要通过分组的键(也就是ind的值)定位原DataFrame的对应行来修改:
for ind_val, group in df.groupby('ind'): # 判断当前分组是否包含'Hat' if group['val'].str.contains('Hat').any(): # 定位原df中ind等于当前分组值的所有行,将val设为'Hat' df.loc[df['ind'] == ind_val, 'val'] = 'Hat'
方案二:更高效的向量化方法(推荐)
Pandas的transform方法可以把分组的计算结果广播回原DataFrame的每一行,不用写循环,处理大数据量时速度更快:
# 生成一个布尔序列,标记每一行所在的分组是否包含'Hat' has_hat_in_group = df.groupby('ind')['val'].transform(lambda x: x.str.contains('Hat').any()) # 对所有符合条件的行,将val设置为'Hat' df.loc[has_hat_in_group, 'val'] = 'Hat'
验证示例
用你给出的测试数据来验证:
import pandas as pd # 构造示例DataFrame data = { 'ind': [1,1,1,2,2,3,3,3], 'val': ['Hat', 'Cat', 'Cat', 'Dog', 'Log', 'Hat', 'Hat', 'Hat'] } df = pd.DataFrame(data) # 运行方案二的代码 has_hat_in_group = df.groupby('ind')['val'].transform(lambda x: x.str.contains('Hat').any()) df.loc[has_hat_in_group, 'val'] = 'Hat' print(df)
输出结果:
ind val 0 1 Hat 1 1 Hat 2 1 Hat 3 2 Dog 4 2 Log 5 3 Hat 6 3 Hat 7 3 Hat
内容的提问来源于stack exchange,提问作者SharpObject
相关产品推荐
相关产品推荐

