Pandas groupby дает неправильные значения - PullRequest
1 голос
/ 16 октября 2019

Я написал фрейм данных, используя pandas в python, который состоит из чисел и строк:

import pandas as pd
import numpy as np
d = {'col1': [1, 5,1,5,1,5,1,5], 'col2': [20,20,40,40,20,20,40,40],\
     'col3': np.arange(1,9)*0.1,\
     'col4':['Jen','Ross','Chan','Mon','Joe','Phebe','Janice','Gunter']}
df = pd.DataFrame(data=d)

Фрейм данных выглядит следующим образом:

col1    col2    col3    col4
0   1   20      0.1     Jen
1   5   20      0.2     Ross
2   1   40      0.3     Chan
3   5   40      0.4     Mon
4   1   20      0.5     Joe
5   5   20      0.6     Phoebe
6   1   40      0.7     Janice
7   5   40      0.8     Gunther

Используя groupby, я хочунайдите минимальное значение col3 для каждой уникальной пары (x, y), где x принадлежит к col1, а y принадлежит к col2. Мне также нужно знать, какое соответствующее имя в col4 приводит к такому минимуму. Я сделал:

df2=df.groupby(['col1','col2']).min()
print(df2)

Я получил:

col1    col2    col3    col4        
1       20      0.1     Jen
        40      0.3     Chan
5       20      0.2     Phoebe
        40      0.4     Gunther

Как видите, последние две строки неверны. Глядя на пару (5,20) в таблице, минимальное значение составляет 0,2 (правильно), но появляется для Росса (не для Фиби). Как я могу это исправить?

Ответы [ 2 ]

5 голосов
/ 16 октября 2019

Мы можем использовать idxmin исправить это

df.loc[df.groupby(['col1','col2'])['col3'].idxmin(),:]
   col1  col2  col3  col4
0     1    20   0.1   Jen
2     1    40   0.3  Chan
1     5    20   0.2  Ross
3     5    40   0.4   Mon

Или drop_duplicates

df.sort_values(['col3']).drop_duplicates(['col1','col2'])
   col1  col2  col3  col4
0     1    20   0.1   Jen
1     5    20   0.2  Ross
2     1    40   0.3  Chan
3     5    40   0.4   Mon
3 голосов
/ 16 октября 2019

С nsmallest

IMO, используйте ответ WeNYoBen drop_duplicates.

Преимущество этого ответа состоит в том, что он легко обобщает получение числа n строк из каждой группы.

См. nsmallest
См. nlargest

pd.concat(d.nsmallest(n=1, columns=['col3']) for _, d in df.groupby(['col1', 'col2']))

   col1  col2  col3  col4
0     1    20   0.1   Jen
2     1    40   0.3  Chan
1     5    20   0.2  Ross
3     5    40   0.4   Mon
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...