如何在Pandas中按某列唯一值获取多列的唯一值?
分组获取多列唯一值并整理成指定格式
首先定义原始DataFrame:
import pandas as pd df = pd.DataFrame({'val':['a', 'a', 'b', 'a', 'c'], 'g_1':[0, 0, 1,0,2], 'g_2':[0, 0, 0,0,1]})
单独处理g_1列时,通过以下代码可以正常获取每个val对应的唯一值:
print(df['g_1'].groupby(df['val']).unique().apply(pd.Series))
输出结果:
0 val a 0 b 1 c 2
但尝试同时处理g_1和g_2列时,执行以下代码会报错:
print(df[['g_1', 'g_2']].groupby(df['val']).unique().apply(pd.Series))
期望得到的结果格式:
g_1 g_2 val a 0 0 b 1 0 c 2 1
解决方案
方法1:使用agg结合lambda提取唯一值
由于每个val分组下的g_1和g_2都是单一唯一值,可以直接对分组后的列提取唯一值的第一个元素:
result = df.groupby('val').agg(lambda x: x.unique()[0]) print(result)
方法2:直接取分组后的第一个/最后一个元素
因为每个分组内的g_1和g_2值都相同,使用first()或last()可以快速得到结果:
result = df.groupby('val')[['g_1', 'g_2']].first() print(result)
方法3:指定列处理逻辑再格式化
先对每列取唯一值,再通过applymap提取每个唯一值数组的第一个元素:
result = df.groupby('val').agg({'g_1': 'unique', 'g_2': 'unique'}).applymap(lambda x: x[0]) print(result)
报错原因说明
对多列分组后调用unique(),会返回每个分组的二维数组结构,此时用apply(pd.Series)无法正确解析为期望的列结构。而通过agg分别处理每列,再提取唯一值的第一个元素(因分组内该列仅一个唯一值),就能得到符合要求的格式。
内容的提问来源于stack exchange,提问作者armin
相关产品推荐
相关产品推荐

