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

如何在Pandas DataFrame中按col1分组并聚合去重的col3值?

如何在Pandas中按分组聚合去重后的同义词

原始数据

import pandas as pd

df = pd.DataFrame({
    'col1': [10002, 10002, 10002, 10003, 10003, 10003],
    'col2': ['en', 'es', 'ru', 'en', 'de', 'nl'],
    'col3': ['tea', 'te', 'te', 'coffee', 'kaffee', 'kaaffee']
})

需求

按col1分组,将col2不为'en'的col3值去重后用|拼接,最终输出格式如下:

col1 Term Name       Synonyms
0  10002       tea            te
1  10003    coffee  kaffee | kaaffee

现有代码问题

你当前的代码会把col1=10002的同义词拼接成te | te,没有实现去重;同时分组时使用全局的df['col2'] != 'en'存在索引匹配风险——分组后x的索引是原表索引,全局筛选可能跨组错误匹配。

# 原代码
grouped = df.groupby(['col1'])
        .agg({'col3': lambda x: ' | '.join(x[df['col2'] != 'en'])})
        .reset_index()

df_result = pd.merge(df[df['col2'] == 'en'], grouped, on=['col1'], how='left')
df_result = df_result[['col1', 'col3_x', 'col3_y']]
df_result.columns = ['col1', 'Term Name', 'Synonyms']

解决方案

方法1:用groupby.apply实现组内筛选+去重+拼接

逻辑清晰,直接在每个分组内操作:

# 分组聚合去重后的同义词
grouped = df.groupby('col1').apply(
    lambda g: ' | '.join(g[g['col2'] != 'en']['col3'].drop_duplicates())
).reset_index(name='Synonyms')

# 获取每个col1对应的英文Term Name
term_names = df[df['col2'] == 'en'][['col1', 'col3']].rename(columns={'col3': 'Term Name'})

# 合并结果
df_result = pd.merge(term_names, grouped, on='col1', how='left')

方法2:用groupby.agg一步完成

更简洁的写法,直接在agg中同时生成Term Name和Synonyms:

df_result = df.groupby('col1').agg(
    Term Name=('col3', lambda x: x[df.loc[x.index, 'col2'] == 'en'].iloc[0]),
    Synonyms=('col3', lambda x: ' | '.join(df.loc[x.index[df.loc[x.index, 'col2'] != 'en'], 'col3'].drop_duplicates()))
).reset_index()

最终输出

两种方法运行后都能得到目标结果:

col1 Term Name       Synonyms
0  10002       tea            te
1  10003    coffee  kaffee | kaaffee

内容的提问来源于stack exchange,提问作者rshar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:30