групповые строки из нескольких столбцов в списке в python pandas - PullRequest
1 голос
/ 12 февраля 2020

У меня есть Pandas DataFrame, который выглядит следующим образом:

    id     a    b    c       col
1   a      1    2    Null    'aa'
2   a      2    2    3       'aa'
3   b      4    3    1       'bb'
4   c      1    Null 3       'gg'
5   c      Null 2    Null    'gg'

Я хочу сгруппировать столбцы, чтобы получить следующее:

    id     new_col           col
1   a      [1, 2, 2, 2, 3]   'aa'
2   b      [4, 3, 1]         'bb'
3   c      [1, 3, 2]         'gg'

Возможно ли это сделать с помощью pd .группа по?

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 февраля 2020

Вы можете использовать df.melt с groupby+agg:

final = (df.replace('Null',np.nan).melt(['id','col'],value_name='new_col').groupby('id'
         ,as_index=False).agg({'new_col':lambda x: x.dropna().tolist(),'col':'first'}))

Или stack сначала с set_index затем groupby+agg

final1 = (df.replace('Null',np.nan).set_index(['id','col']).stack().rename('new_col')
       .reset_index('col').groupby(level=0).agg({'new_col':list,'col':'first'}))

  id          new_col   col
0  a  [1, 2, 2, 2, 3]  'aa'
1  b        [4, 3, 1]  'bb'
2  c        [1, 2, 3]  'gg'
2 голосов
/ 12 февраля 2020

Используйте GroupBy.apply с DataFrame.stack по всем столбцам без указания в списке по Index.difference:

df = df.replace('Null', np.nan)

c = df.columns.difference(['id','col'])
f = lambda x: x.stack().tolist()
df = df.groupby(['id','col'])[c].apply(f).reset_index(name='new_col')[['id','new_col','col']]
print (df)
  id          new_col   col
0  a  [1, 2, 2, 2, 3]  'aa'
1  b        [4, 3, 1]  'bb'
2  c        [1, 3, 2]  'gg'
1 голос
/ 12 февраля 2020
df["d"] = df[['a', 'b', 'c']].values.tolist()
dup = df.groupby(['id','col'])['d'].sum().reset_index(name='new_col')
...