Объединить несколько значений столбца после группы в один столбец в python pandas - PullRequest
2 голосов
/ 21 марта 2020

Я хочу выполнить задачу, аналогичную этой теме: Объединить несколько значений столбцов в один столбец в python pandas

Но разница в том, что я хотел бы создайте новый столбец, который объединяет все ненулевые значения в столбце после группировки по другому столбцу (столбцам). Вот игрушечный пример:

df= pd.DataFrame({'ID1' : [1,1,2,2,3,3,3],'ID2' : ['a','a','b','b','c','c','c'],
             'Status' : pd.Series([np.nan,'1', np.nan,'1','2',np.nan,'1'], 
                                  dtype="category")})

 df
Out[74]: 
     ID1 ID2 Status
 0    1   a    NaN
 1    1   a      1
 2    2   b    NaN
 3    2   b      1
 4    3   c      2
 5    3   c    NaN
 6    3   c      1

Затем я хочу groupby ID1 и ID2:

gr = df.groupby(['ID1','ID2'])

Затем я хотел бы, чтобы мой результат выглядел следующим образом:

Out:
   NewCol
0   1
1   1
2   2,1

Итак, это новый DataFrame, который содержит non-null значения столбца Status, сгруппированные по ID1 и ID2.

Заранее спасибо.

1 Ответ

1 голос
/ 21 марта 2020

Использование GroupBy.agg с лямбда-функцией - наиболее общее решение:

df1 = df.groupby(['ID1','ID2'])['Status'].agg(lambda x: ','.join(x.dropna())).reset_index()
print (df1)
   ID1 ID2 Status
0    1   a      1
1    2   b      1
2    3   c    2,1

Другая идея - удалить дубликаты на первом шаге, но если какая-то группа, имеющая только ошибочные значения, удаляется из вывода, поэтому необходима следующая обработка, например merge:

#first group with only NaNs
df= pd.DataFrame({'ID1' : [1,1,2,2,3,3,3],'ID2' : ['a','a','b','b','c','c','c'],
             'Status' : pd.Series([np.nan,np.nan, np.nan,'1','2',np.nan,'1'], 
                                  dtype="category")})


#first group is dropped
df11 = (df.dropna(subset=['Status'])
          .groupby(['ID1','ID2'])['Status']
          .agg(','.join)
          .reset_index())
print (df11)
   ID1 ID2 Status
0    2   b      1
1    3   c    2,1

#added missing pairs and `NaN`s converted to empty strings:
df2 = df.drop_duplicates(['ID1','ID2'])[['ID1','ID2']].merge(df11, how='left').fillna('')
print (df2)
   ID1 ID2 Status
0    1   a       
1    2   b      1
2    3   c    2,1

Первое решение:

df1 = df.groupby(['ID1','ID2'])['Status'].agg(lambda x: ','.join(x.dropna())).reset_index()
print (df1)
   ID1 ID2 Status
0    1   a       
1    2   b      1
2    3   c    2,1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...