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

Python中如何用Pandas内置方法为DataFrame添加收集另一DataFrame值的列并去重?

问题描述

我有两个Pandas DataFrame:
第一个DataFrame(df1)结构如下:

nameval
name10
name21

第二个DataFrame(df2)结构如下:

nametag
name1tg1
name1tg2
name1tg3
name1tg3
name2kg1
name2kg1
name3other

需求:为df1添加一列new_column,按name字段收集df2中的所有tag值,得到如下结果:

namevalnew_column
name10[tg1, tg2, tg3, tg3]
name21[kg1, kg1]

已知可以用逐行操作实现,但想知道能否用Pandas内置方法完成?另外如果要同时去除new_column中数组的重复值,应该用什么方法?

解决方案

1. 使用Pandas内置方法收集所有tag值

可以通过groupby+agg结合merge实现,无需逐行遍历:

import pandas as pd

# 示例数据
df1 = pd.DataFrame({'name': ['name1', 'name2'], 'val': [0, 1]})
df2 = pd.DataFrame({'name': ['name1', 'name1', 'name1', 'name1', 'name2', 'name2', 'name3'],
                    'tag': ['tg1', 'tg2', 'tg3', 'tg3', 'kg1', 'kg1', 'other']})

# 对df2按name分组,将tag聚合为列表
tag_groups = df2.groupby('name')['tag'].agg(list).reset_index(name='new_column')
# 左合并到df1,仅保留df1原有name记录
result = df1.merge(tag_groups, on='name', how='left')

print(result)

执行后即可得到需求的结果,how='left'能确保只保留df1中存在的name条目。

2. 同时去除列表中的重复值

如果需要去重,只需修改聚合逻辑,用lambda结合去重方法即可:

# 聚合时对tag去重
tag_groups_unique = df2.groupby('name')['tag'].agg(lambda x: list(pd.unique(x))).reset_index(name='new_column')
# 合并到df1
result_unique = df1.merge(tag_groups_unique, on='name', how='left')

print(result_unique)

执行后得到去重后的结果:

namevalnew_column
name10[tg1, tg2, tg3]
name21[kg1]

如果需要严格保留tag出现的原始顺序,也可以用lambda x: list(dict.fromkeys(x))替代(Python 3.7+版本中dict.fromkeys会保留元素插入顺序)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:45:29