使用groupby删除DataFrame中特定SCU_KEY对应所有行的方法咨询
Pandas 筛选历史有过采购记录的企业数据解决方案
实现方法1(性能最优,推荐)
直接使用groupby.transform实现单行过滤,无需额外拼接操作,保留所有符合条件企业的全部历史记录:
df_filtered = df_4[df_4.groupby('SCU_KEY')['REVENUE_STATUS_FLAG'].transform('sum') != 0]
原理:transform会将分组聚合后的结果映射回原DataFrame的每一行,筛选出分组求和结果不等于0的行,自动剔除所有从未有过采购记录的企业的全部数据,同时不会删除有采购记录企业的REVENUE_STATUS_FLAG=0的历史行,完全满足观测状态变化的需求。
实现方法2(lambda 分组过滤写法)
使用groupby.filter结合lambda函数实现:
df_filtered = df_4.groupby('SCU_KEY').filter(lambda x: x['REVENUE_STATUS_FLAG'].sum() != 0)
该写法逻辑更直观,但数据量较大时性能低于transform方法。
实现方法3(基于已计算的分组求和结果筛选)
如果已经运行过你编写的分组求和代码,可以基于求和结果二次筛选:
# 你的原有分组求和代码 sum_df = df_4.groupby('SCU_KEY')[['REVENUE_STATUS_FLAG']].sum().reset_index() # 筛选出有过采购记录的SCU_KEY valid_scu = sum_df[sum_df['REVENUE_STATUS_FLAG'] != 0]['SCU_KEY'] # 过滤原DataFrame df_filtered = df_4[df_4['SCU_KEY'].isin(valid_scu)]
适合需要先查看各企业求和统计结果的场景。
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

