作者:body胤ly_680 | 来源:互联网 | 2022-12-04 17:26
样本数据:
0 1 2 3 4 Sum_max_3
0 591949 2575703 22479693 2202865 499835 27258261
1 2705 11426 339913 5438 1016 356777
2 18 119 4162 18 0 4299
3 264 1213 14999 246 116 16476
4 0 35 1292 10 0 1337
5 0 0 1442 0 0 1442
6 0 28 5596 20 0 5644
7 0 10 102 56 0 168
8 33 0 1224 17 0 1274
9 39 198 9505 62 35 9765
我想得到行中最大值的3列的总和.这些是每行的不同列(Sum_max_3).
我有很多列,所以我需要自动为所有这些列.
1> user3483203..:
您应该使用numpy.partition
以避免完全排序.这将减少从发现三个最大值的时间复杂度O(nlogn)
到O(n)
,这将使大型DataFrames一个巨大的差异:
np.sum(np.partition(df.values, -3)[:, -3:], 1)
df.assign(max3=np.sum(np.partition(df.values, -3)[:, -3:], 1))
0 1 2 3 4 max3
0 591949 2575703 22479693 2202865 499835 27258261
1 2705 11426 339913 5438 1016 356777
2 18 119 4162 18 0 4299
3 264 1213 14999 246 116 16476
4 0 35 1292 10 0 1337
5 0 0 1442 0 0 1442
6 0 28 5596 20 0 5644
7 0 10 102 56 0 168
8 33 0 1224 17 0 1274
9 39 198 9505 62 35 9765
计时
In [411]: df = pd.DataFrame(np.random.rand(5000, 5000))
In [412]: %timeit np.sum(np.sort(df.values)[:,-3:],axis=1)
1.69 s ± 92.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [413]: %timeit np.sum(np.partition(df.values, -3)[:, -3:], 1)
364 ms ± 23.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)