отфильтруйте Pandas фрейм данных для добавленных уникальных значений - PullRequest
1 голос
/ 11 марта 2020

Я хотел бы знать, что мне нужно сделать, чтобы отфильтровать кадр данных, сохранив уникальные значения столбца Name, добавив значения из столбца Value и добавив новый столбец для подсчета появления каждого Name

что у меня есть это:

     Name Type  Value
0   apple    A      1
1  banana    B      3
2   apple    A      2
3    pear    P      4
4   apple    A      6
5  carrot    C      3
6  banana    B      2

и я хочу отфильтровать это так:

     Name Type  AddedValue  Occurrences
0   apple    A      9       3
1  banana    B      5       2
2    pear    P      4       1
3  carrot    C      3       1

Как я могу это сделать? Я пытался придумать метод .join с набором условий where, но я не могу заставить его работать, и я уверен, что проблема в том, что я пытаюсь перевести pythoni c, думая, где, безусловно, есть инструкция панды, которая решает мою проблему с помощью элегантной векторной операции или чего-то в этом роде

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

Ответы [ 2 ]

4 голосов
/ 11 марта 2020

Попробуйте groupby метод:

df.groupby(["Name","Type"]).agg(["count","sum"])

Результат:

            Value    
            count sum
Name   Type          
apple  A        3   9
banana B        2   5
carrot C        1   3
pear   P        1   4

Однако, если вы хотите сгладить столбцы / индекс, используйте:

df2 = df.groupby(["Name","Type"]).agg(["count","sum"]).reset_index(drop=False)

df2.columns = [' '.join(col).strip() for col in df2.columns.values]

Вывод :

     Name Type  Value count  Value sum
0   apple    A            3          9
1  banana    B            2          5
2  carrot    C            1          3
3    pear    P            1          4

Еще более элегантное решение благодаря @piRSquared:

df2 = df.groupby(['Name', 'Type']).Value.agg([('AddedValue', 'sum'), ('Occurences', 'count')]).reset_index(drop=False)

Вывод:

     Name Type  AddedValue  Occurences
0   apple    A           9           3
1  banana    B           5           2
2  carrot    C           3           1
3    pear    P           4           1
1 голос
/ 11 марта 2020

Да, так же, как ipj ответил, вы можете попробовать групповой метод в Pandas Групповой .

df = df.groupby(["Name","Type"]).agg(["count","sum"])
df.columns = df.columns.droplevel(0)
df = df.rename({"count": "AddedValue", "sum": "Occurrences"}, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...