如何在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
相关产品推荐
相关产品推荐

