我的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并在最后连接它们。
谢谢
答案 0 :(得分:3)
将GroupBy.agg
与DataFrameGroupBy.idxmax
和DataFrameGroupBy.idxmin
一起使用,按DataFrame.melt
进行整形,并按DataFrame.loc
选择行:
df1 = df.loc[df.groupby('A')['B'].agg(['idxmax','idxmin']).melt()['value']].drop_duplicates()
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)
使用groupby
,apply
和loc
仅选择列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)