You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:06:04