我正在尝试通过唯一的binId对以下数据帧进行分组,然后根据“z”解析生成的行并选择具有最高值“z”的行。这是我的数据框架。
import pandas as pd
df = pd.DataFrame({'ID':['1','2','3','4','5','6'], 'binId': ['1','2','2','1','1','3'], 'x':[1,4,5,6,3,4], 'y':[11,24,35,16,23,34],'z':[1,4,5,2,3,4]})
` 我尝试了下面的代码,它提供了所需的答案,
def f(x):
tp = df[df['binId'] == x][['binId','ID','x','y','z']].sort_values(by='z', ascending=False).iloc[0]
return tp`
然后,
binids= pd.Series(df.binId.unique())
print binids.apply(f)
输出是,
binId ID x y z
0 1 5 3 23 3
1 2 3 5 35 5
2 3 6 4 34 4
但执行太慢了。这样做的更快的方法是什么?
答案 0 :(得分:1)
将idxmax
用于max
的索引并按loc
选择:
df1 = df.loc[df.groupby('binId')['z'].idxmax()]
或sort_values
使用drop_duplicates
时更快:
df1 = df.sort_values(['binId', 'z']).drop_duplicates('binId', keep='last')
print (df1)
ID binId x y z
4 5 1 3 23 3
2 3 2 5 35 5
5 6 3 4 34 4