groupby处理后合并不同大小dataframe并保留原表STATE、CITY字段
解决思路
直接关联出现行数膨胀是因为同一(COD, TEC, SET, AZIM)组合在原表中有多行重复记录,关联时触发笛卡尔积匹配导致行数回到原表规模。以下两种方案都可以得到你需要的9行结果:
方案1:直接在分组聚合阶段返回所有需要的字段(推荐)
不需要事后关联,分组时直接计算所有目标字段,代码如下:
import pandas as pd def group_agg_rule(group): # 按原有逻辑计算AZIM目标值:众数的最大值 target_azim = pd.Series.mode(group['AZIM']).max() # 取对应AZIM行的CITY(同一AZIM下CITY一致,取第一条即可) target_city = group.loc[group['AZIM'] == target_azim, 'CITY'].iloc[0] # 同一COD对应唯一STATE,直接取第一条 target_state = group['STATE'].iloc[0] return pd.Series([target_azim, target_state, target_city], index=['AZIM','STATE','CITY']) # 分组聚合直接得到最终结果 df_result = df.groupby(["COD", "TEC", "SET"], as_index=False).apply(group_agg_rule).reset_index(drop=True)
方案2:已有聚合结果df_cut时,关联去重后的原表
如果已经生成了df_cut不想重新跑聚合,可以先对原表按关联键去重后再关联:
# 原表按关联键去重,避免匹配时产生重复行 df_distinct = df[['COD','TEC','SET','AZIM','STATE','CITY']].drop_duplicates(subset=['COD','TEC','SET','AZIM']) # 左关联得到所有需要的字段 df_result = df_cut.merge(df_distinct, on=['COD','TEC','SET','AZIM'], how='left')
内容的提问来源于stack exchange,提问作者Harry Jones
相关产品推荐
相关产品推荐

