Панды группы двойных наблюдений по агрегирующему столбцу - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть такой кадр данных:

+----------+---------+
| username | role    |
+----------+---------+
| foo      | user    |
+----------+---------+
| foo      | analyst |
+----------+---------+
| bar      | admin   |
+----------+---------+

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

+----------+---------------+
| username | role          |
+----------+---------------+
| foo      | user, analyst |
+----------+---------------+
| bar      | admin         |
+----------+---------------+

До сих пор я пытался использовать сводную таблицу следующим образом:

table = pd.pivot_table(df, index='username', columns='role')

, а также функцию groupby, но это неправильный способ сделать это.Как с этим справиться?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете создать список или отдельные запятые строки, используя следующее:

df.groupby('username')['role'].agg(list).reset_index()

Вывод:

  username             role
0      bar          [admin]
1      foo  [user, analyst]

ИЛИ

df.groupby('username')['role'].agg(lambda x: ', '.join(x)).reset_index()

OUtput:

  username           role
0      bar          admin
1      foo  user, analyst
0 голосов
/ 11 сентября 2018

То, что вы хотите сделать, - это сгруппировать строки на основе username, поэтому функция groupby - это один из способов.Обычно, когда вы используете groupby, вы применяете функцию агрегирования к остальным столбцам, например, sum, average, min или similair.Но вы также можете определить свою собственную функцию агрегирования и использовать ее в agg.

def merge_strings(series):
    # This function will get a series of all the values in a column. For example for foo the series will be ['user', 'analyst'].
    # We can use the built in function str.cat() fo contatenate a series of strings.

    return series.str.cat(sep=', ')

Затем мы просто вызываем groupby и говорим, что хотим агрегировать столбец role, используя нашу пользовательскую функцию

df.groupby('username').agg({'role': merge_strings})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...