Объединять уникальные значения из нескольких столбцов с помощью панд GroupBy - PullRequest
0 голосов
/ 10 января 2019

Я вошел в бесчисленные темы ( 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, и в то же время собрать все остальные столбцы, но только с уникальными значениями. Вот так:

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 должно иметь тип hashable

  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() с разными вариантами, но не добился успеха.

Есть ли у кого-нибудь из вас идеи?

Большое спасибо:)

Ответы [ 2 ]

0 голосов
/ 10 января 2019

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
0 голосов
/ 10 января 2019

Используйте groupby и 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
...