Агрегировать значения по нескольким столбцам - PullRequest
1 голос
/ 03 августа 2020

Мой фрейм данных выглядит так.

df = pd.DataFrame({
    'ID': [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3],
    'text': ['a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'f', 'g']  ,
    'out_text': ['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10', 'x11', 'x12', 'x13', 'x14']  ,  
    'Rule_1': ['N', 'N', 'N', 'Y', 'N', 'N', 'N', 'N', 'N', 'N','N', 'N', 'Y', 'Y'],
    'Rule_2': ['Y', 'N', 'N', 'N', 'Y', 'N', 'N', 'N', 'N', 'N','N', 'N', 'Y', 'N'],
    'Rule_3': ['N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N','N', 'N', 'Y', 'Y']})
    ID text out_text Rule_1 Rule_2 Rule_3
0    1    a       x1      N      Y      N
1    1    a       x2      N      N      N
2    1    b       x3      N      N      N
3    1    b       x4      Y      N      N
4    2    c       x5      N      Y      N
5    2    c       x6      N      N      N
6    2    c       x7      N      N      N
7    2    d       x8      N      N      N
8    2    d       x9      N      N      N
9    2    e      x10      N      N      N
10   2    e      x11      N      N      N
11   2    e      x12      N      N      N
12   3    f      x13      Y      Y      Y
13   3    g      x14      Y      N      Y

Мне нужно агрегировать Rule_1, Rule_2, Rule_3 так, чтобы, если комбинация ID и Text имела 'Y' в любом из этих столбцов , общий результат - Y для этой комбинации. В нашем примере 1-a и 1-b - это Y в целом. 2-d и 2-e - это «N». Как агрегировать несколько столбцов?

1 Ответ

2 голосов
/ 03 августа 2020

Давайте попробуем использовать max(1) для агрегирования правил по строкам, затем groupyby().any(), чтобы проверить, есть ли в какой-либо строке Y:

(df[['Rule_1','Rule_2','Rule_3']].eq('Y')
   .max(axis=1)
   .groupby([df['ID'],df['text']])
   .any()
)

Вывод:

ID  text
1   a        True
    b        True
2   c        True
    d       False
    e       False
3   f        True
    g        True
dtype: bool

Или, если вы хотите Y/N, мы можем изменить max/any на max и отбросить сравнение:

(df[['Rule_1','Rule_2','Rule_3']]
   .max(axis=1)
   .groupby([df['ID'],df['text']])
   .max()
)

Вывод:

ID  text
1   a       Y
    b       Y
2   c       Y
    d       N
    e       N
3   f       Y
    g       Y
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...