Pandas groupby分组比较报错不支持SeriesGroupBy用'>'如何解决
问题原因
groupby()返回的是SeriesGroupBy分组中间对象,并没有计算出具体的Rank值,Python不支持直接对该类型对象做大小比较,所以触发类型错误- 你原有代码中的行筛选语法也有错误:
df1['Type' == 'A']会先计算字符串Type和A是否相等,得到布尔值False,相当于取df1[False],完全不符合筛选Type列等于A的需求,正确写法是df1[df1['Type'] == 'A']
解决方法
首先明确你的需求场景,分别对应两种修改方案:
场景1:所有(id, Date)组的Rank都满足df1>df2时,才全局筛选两个表的Type列
如果你的需求是全局判断所有分组的Rank大小,再统一筛选,代码如下:
# 提取两个表每个(id,Date)对应的Rank,first()表示取每个分组的第一个Rank值,如有聚合需求可替换为max/min/mean等 rank1 = df1.groupby(["id", "Date"])['Rank'].first() rank2 = df2.groupby(["id", "Date"])['Rank'].first() # 取两个表共有的(id,Date)分组做比较 common_groups = rank1.index.intersection(rank2.index) rank1_common = rank1.loc[common_groups] rank2_common = rank2.loc[common_groups] # 所有分组的df1 Rank都大于df2时走第一个分支 if (rank1_common > rank2_common).all(): df1 = df1[df1['Type'] == 'A'] df2 = df2[df2['Type'] == 'D'] else: df1 = df1[df1['Type'] == 'D'] df2 = df2[df2['Type'] == 'A']
场景2:按每个(id, Date)组分别判断Rank大小,仅筛选对应组的符合Type条件的行
如果你的需求是不同分组独立判断,各自筛选对应行,代码如下:
# 提取两个表的分组Rank并对齐 rank_df = df1.groupby(["id", "Date"])['Rank'].first().reset_index(name='rank1')\ .merge(df2.groupby(["id", "Date"])['Rank'].first().reset_index(name='rank2'), on=['id','Date']) rank_df['df1_rank_higher'] = rank_df['rank1'] > rank_df['rank2'] # 把判断条件合并回原表后做筛选 df1 = df1.merge(rank_df[['id','Date','df1_rank_higher']], on=['id','Date'], how='inner') df1 = df1[ (df1['df1_rank_higher'] & (df1['Type'] == 'A')) | (~df1['df1_rank_higher'] & (df1['Type'] == 'D')) ].drop(columns='df1_rank_higher').reset_index(drop=True) df2 = df2.merge(rank_df[['id','Date','df1_rank_higher']], on=['id','Date'], how='inner') df2 = df2[ (df2['df1_rank_higher'] & (df2['Type'] == 'D')) | (~df2['df1_rank_higher'] & (df2['Type'] == 'A')) ].drop(columns='df1_rank_higher').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者user17037971
相关产品推荐
相关产品推荐

