我想保留一条记录,每个记录对每个id都有最大的系列。所以对于每个id,我需要一行。我想我需要像
这样的东西df_new = df.groupby('id')['series'].nlargest(1)
,但那肯定是错的。
这就是我的数据集的样子:
id series s1 s2 s3
1 2 4 9 1
1 8 6 2 2
1 3 9 1 3
2 9 4 1 5
2 2 2 5 5
2 5 1 7 8
3 6 7 2 3
3 2 4 4 1
3 1 3 9 9
这应该是结果:
id series s1 s2 s3
1 8 6 2 2
2 9 4 1 5
3 6 7 2 3
答案 0 :(得分:6)
您希望在{id'列上groupby
获取IIUC,并使用idxmax()
获取“系列”值最大的索引标签,并使用此标记在orig df中进行索引:
In [91]:
df.loc[df.groupby('id')['series'].idxmax()]
Out[91]:
id series s1 s2 s3
1 1 8 6 2 2
3 2 9 4 1 5
6 3 6 7 2 3
答案 1 :(得分:4)
使用sort_values
和汇总first
的另一种解决方案:
df = df.sort_values(by="series", ascending=False).groupby("id", as_index=False).first()
print (df)
id series s1 s2 s3
0 1 8 6 2 2
1 2 9 4 1 5
2 3 6 7 2 3
答案 2 :(得分:3)
这是一个基于NumPy的解决方案 -
def grouby_max(df):
arr = df[['id','series']].values
n = arr.shape[0]-1
idx = (arr[:,0]*(arr[:,1].max()+1) + arr[:,1]).argsort()
sidx = np.append(np.nonzero(arr[idx[1:],0] > arr[idx[:-1],0])[0],n)
return df.iloc[idx[sidx]]
运行时测试 -
In [201]: # Setup input
...: N = 100 # Number of groups
...: data = np.random.randint(11,999999,(10000,5))
...: data[:,0] = np.sort(np.random.randint(1,N+1,(data.shape[0])))
...: df = pd.DataFrame(data, columns=[['id','series','s1','s2','s3']])
...:
In [202]: %timeit df.loc[df.groupby('id')['series'].idxmax()]
100 loops, best of 3: 15.8 ms per loop #@EdChum's soln
In [203]: %timeit df.sort_values(by="series", ascending=False).groupby("id", as_index=False).first()
100 loops, best of 3: 4.52 ms per loop #@jezrael's soln
In [204]: %timeit grouby_max(df)
100 loops, best of 3: 1.96 ms per loop