Pandas: как подсчитывать значения в группах - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть следующий фрейм данных. Сначала я хочу сгруппировать по a и b. В каждой группе мне нужно сделать подсчет значений на основе c и выбрать только тот, который имеет наибольшее количество отсчетов. Если для одной группы с наибольшим количеством имеется более одного c значений, просто выберите любое.

a    b    c
1    1    x
1    1    y
1    1    y
1    2    y
1    2    y
1    2    z
2    1    z
2    1    z
2    1    a
2    1    a

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

a    b    c
1    1    y
1    2    y
2    1    z

Что является правильным способ сделать это? Было бы еще лучше, если бы я мог распечатать каждую группу со значениями c, отсортированными в качестве промежуточного шага.

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Вы ищете .value_counts():

df.groupby(['a', 'b'])['c'].value_counts()
a  b  c
1  1  y    2
      x    1
   2  y    2
      z    1
2  1  a    2
      z    2
Name: c, dtype: int64
1 голос
/ 10 апреля 2020

сгруппируйте исходный фрейм данных по ['a', 'b'] и получите .max(), который должен работать

df.groupby(['a', 'b'])['c'].max()

, вы также можете агрегировать 'count' и 'max' значения

df.groupby(['a', 'b'])['c'].agg({'max': max, 'count': 'count'}).reset_index()
0 голосов
/ 10 апреля 2020

Попробуйте:

df=df.groupby(["a", "b", "c"])["c"].count().sort_values(ascending=False).reset_index(name="dropme").drop_duplicates(subset=["a", "b"], keep="first").drop("dropme", axis=1)

Выходы:

   a  b  c
0  2  1  z
2  1  2  y
3  1  1  y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...