выбор строк с минимальным и максимальным значениями в панде - PullRequest
3 голосов
/ 08 июля 2019

my df:

df=pd.DataFrame({'A':['Adam','Adam','Adam','Adam'],'B':[24,90,67,12]})

Я хочу выбрать только строки с одинаковыми именами с минимальным и максимальным значением в этом df.я могу сделать это, используя этот код:

df_max=df[df['B']==(df.groupby(['A'])['B'].transform(max))]
df_min=df[df['B']==(df.groupby(['A'])['B'].transform(min))]
df=pd.concat([df_max,df_min])

Есть ли способ сделать это в одну строку?Я предпочитаю не создавать два дополнительных df и конкатить их в конце.

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 июля 2019

Используйте GroupBy.agg с DataFrameGroupBy.idxmax и DataFrameGroupBy.idxmin с изменением формы на DataFrame.melt и выберите строки с помощью DataFrame.loc:

df1 = df.loc[df.groupby('A')['B'].agg(['idxmax','idxmin']).melt()['value']].drop_duplicates()

Или DataFrame.stack:

df2 = df.loc[df.groupby('A')['B'].agg(['idxmax','idxmin']).stack()].drop_duplicates()
print (df2)
      A   B
1  Adam  90
3  Adam  12
0 голосов
/ 08 июля 2019

Решение, использующее groupby, apply и loc для выбора только значения min или max столбца 'B'.

ddf = df.groupby('A').apply(lambda x : x.loc[(x['B'] == x['B'].min()) | (x['B'] == x['B'].max())]).reset_index(drop=True)

Результат:

      A   B
0  Adam  90
1  Adam  12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...