Python中如何用Pandas内置方法为DataFrame添加收集另一DataFrame值的列并去重?
问题描述
我有两个Pandas DataFrame:
第一个DataFrame(df1)结构如下:
| name | val |
|---|---|
| name1 | 0 |
| name2 | 1 |
第二个DataFrame(df2)结构如下:
| name | tag |
|---|---|
| name1 | tg1 |
| name1 | tg2 |
| name1 | tg3 |
| name1 | tg3 |
| name2 | kg1 |
| name2 | kg1 |
| name3 | other |
需求:为df1添加一列new_column,按name字段收集df2中的所有tag值,得到如下结果:
| name | val | new_column |
|---|---|---|
| name1 | 0 | [tg1, tg2, tg3, tg3] |
| name2 | 1 | [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)
执行后得到去重后的结果:
| name | val | new_column |
|---|---|---|
| name1 | 0 | [tg1, tg2, tg3] |
| name2 | 1 | [kg1] |
如果需要严格保留tag出现的原始顺序,也可以用lambda x: list(dict.fromkeys(x))替代(Python 3.7+版本中dict.fromkeys会保留元素插入顺序)。
内容的提问来源于stack exchange,提问作者Nekomiya Kasane
相关产品推荐
相关产品推荐

