在熊猫数据框中选择具有最小值和最大值的行

时间:2019-07-08 11:49:33

标签: pandas dataframe

我的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 个答案:

答案 0 :(得分:3)

GroupBy.aggDataFrameGroupBy.idxmaxDataFrameGroupBy.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

答案 1 :(得分:0)

使用groupbyapplyloc仅选择列min的{​​{1}}或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)