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

