在python中记录每个id的最大系列

时间:2016-11-03 16:20:39

标签: python pandas numpy

我想保留一条记录,每个记录对每个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

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