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

如何在Pandas中按两列分组并将指定列的唯一值汇总至新列?

按双列分组提取唯一值到新列的解决方案

没问题,要按name1和name2的组合分组来提取prod的唯一值到新列,其实只需要稍微调整分组的列,再选择合适的方法就行。这里给你两种常用的方案,适配不同的习惯:

方案1:用transform(最简洁直接)

transform方法会自动把分组后的结果映射回原DataFrame的每一行,不需要手动处理键的匹配,非常适合这种场景。

import pandas as pd

df = pd.DataFrame({'name1':['x','x','x','z','z'],'name2':['x','x','x','z','z'],'prod':['c','c','f','f','f']})

# 按name1+name2分组,提取prod的唯一值并映射回每一行
df['all_prods'] = df.groupby(['name1', 'name2'])['prod'].transform(lambda x: x.unique())

print(df)

执行后输出结果:

name1 name2 prod all_prods
0     x     x    c    [c, f]
1     x     x    c    [c, f]
2     x     x    f    [c, f]
3     z     z    f       [f]
4     z     z    f       [f]

原理说明:groupby(['name1','name2'])指定了双列分组逻辑,transform(lambda x: x.unique())会为每个分组计算prod的唯一值数组,然后自动将这个数组重复填充到该分组的所有行中,完美匹配原DataFrame的结构。

方案2:沿用你熟悉的map思路(适配原有代码习惯)

如果你习惯用单列分组时的map方法,只需要把name1和name2组合成元组作为映射的键即可——因为双列分组后的结果是MultiIndex索引,对应的键就是(name1值, name2值)的元组。

import pandas as pd

df = pd.DataFrame({'name1':['x','x','x','z','z'],'name2':['x','x','x','z','z'],'prod':['c','c','f','f','f']})

# 先按双列分组,得到每个组合对应的唯一prod
grouped_prods = df.groupby(['name1', 'name2'])['prod'].unique()

# 将name1和name2合并为元组Series,再用map匹配分组结果
df['all_prods'] = df[['name1', 'name2']].apply(tuple, axis=1).map(grouped_prods)

print(df)

输出结果和方案1完全一致。

原理说明:df[['name1','name2']].apply(tuple, axis=1)会把每一行的name1和name2值打包成元组,比如第一行就是('x','x'),然后用这个元组去grouped_prods里查找对应的唯一prod数组,实现映射。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:08:11