首页 > 解决方案 > 使用 pandas GroupBy 聚合来自多个列的唯一值

问题描述

我进入了无数线程(1 2 3 ...),但我仍然没有找到解决我的问题的方法......我有一个这样的数据框:

prop1 prop2 prop3    prop4 
L30   3     bob      11.2
L30   54    bob      10
L30   11    john     10
L30   10    bob      10
K20   12    travis   10 
K20   1     travis   4 
K20   66    leo      10

我想在 prop1 上做一个 groupby,同时,聚合所有其他列,但只有唯一值。像那样:

prop1  prop2       prop3       prop4
L30    3,54,11,10  bob,john    11.2,10
K20    12,1,66     travis,leo  10,4

我尝试了不同的方法:

  1. df.groupby('prop1')['prop2','prop3','prop4'].apply(np.unique) 返回

AttributeError: 'numpy.ndarray' 对象没有属性 'index' PLUS TypeError: Series.name must be a hashable type

  1. 另外:.apply(lambda x: pd.unique(x.values.ravel()).tolist())它给出了一个列表作为输出,我想要列。

  2. df.groupby('prop1')['prop2','prop3','prop4'].unique()本身不起作用,因为有多个列。

  3. .apply(f)f 为:

    def f(df): df['prop2']=df['prop2'].drop_duplicates() df['prop3']=df['prop3'].drop_duplicates() df['prop4']=df['prop4'].drop_duplicates() return df

不做任何事情。

  1. 我也尝试使用.agg()不同的选项,但没有成功。

你们中的一个有什么想法吗?

非常感谢 :)

标签: pythonpandasdataframeuniquepandas-groupby

解决方案


使用groupbyand agg,并通过调用聚合唯一值Series.unique

df.astype(str).groupby('prop1').agg(lambda x: ','.join(x.unique()))

            prop2       prop3      prop4
prop1                                   
K20       12,1,66  travis,leo   10.0,4.0
L30    3,54,11,10    bob,john  11.2,10.0

df.astype(str).groupby('prop1', sort=False).agg(lambda x: ','.join(x.unique()))

            prop2       prop3      prop4
prop1                                   
L30    3,54,11,10    bob,john  11.2,10.0
K20       12,1,66  travis,leo   10.0,4.0

如果处理 NaN 很重要,请fillna提前调用:

import re
df.fillna('').astype(str).groupby('prop1').agg(
    lambda x: re.sub(',+', ',', ','.join(x.unique()))
)

            prop2       prop3      prop4
prop1                                   
K20       12,1,66  travis,leo   10.0,4.0
L30    3,54,11,10    bob,john  11.2,10.0

推荐阅读