Как агрегировать повторяющиеся строки на основе сложного набора условий столбца - PullRequest
0 голосов
/ 03 февраля 2019

Я использую панды, чтобы исследовать набор данных с несколькими повторяющимися записями.Например:

import pandas as pd
pd.DataFrame({'ID':['001','001','002','002','002','003','003','004','004'],
             'a':['Yes','Yes','Yes','No','Yes','Yes','No','No','No'],
             'b':['NaN',3,'NaN',5,4,7,'NaN','NaN','NaN']})

ID  a   b
001 Yes NaN
001 Yes 3
002 Yes NaN
002 No  5
002 Yes 4
003 Yes 7
003 No  NaN
004 No  NaN
004 No  NaN

Каждый дубликат ID должен быть объединен в одну строку, в которой значения столбцов агрегированы в соответствии со следующими правилами:

  • если присутствует в столбце, Yes должен заменить No

  • , если присутствует в столбце, число должно заменить NaN, и если присутствует более одного числа, наибольшееномер должен быть выбран.

Ожидаемый результат:

ID  a   b
001 Yes 3
002 Yes 5
003 Yes 7
004 No  NaN

Я пытался (и не смог) создать пользовательскую функцию, а затем использовать apply и lambda.Тем не менее, я не думаю, что это правильный подход, так как я не вижу способа, чтобы эти построчные операции работали с группой дубликатов.

1 Ответ

0 голосов
/ 03 февраля 2019

Вы можете использовать groupby + max после замены 'NaN' строк на np.nan.Это работает именно потому, что 'Yes' > 'No' возвращает True.Для большей эффективности я советую вам преобразовать серию a в категориальную или логическую серию.

# replace 'NaN' strings with np.nan
df['b'] = df['b'].replace('NaN', np.nan)

# groupby + max, reset index to elevate index to column
res = df.groupby('ID').max().reset_index()

print(res)

    ID    a    b
0  001  Yes  3.0
1  002  Yes  5.0
2  003  Yes  7.0
3  004   No  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...