簡體   English   中英

使用 Pandas GroupBy 從多列聚合唯一值

[英]Aggregate unique values from multiple columns with 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()與不同的選項一起使用,但沒有成功。

你們中的一個人有什么想法嗎?

非常感謝 :)

使用groupbyagg ,並通過調用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

melt + pivot_table

s = df.astype(str).melt(id_vars='prop1').drop_duplicates()

s.pivot_table(
  index='prop1',
  columns='variable',
  values='value',
  aggfunc=','.join)

variable       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.groupby(['prop1','prop2', 'prop4']).agg(lambda x: ','.join(x.unique())).reset_index()

這將給出如下結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM