样本数据:
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)都是不同的列。
我有很多列,所以我需要对所有列自动执行。
答案 0 :(得分:7)
您应使用numpy.partition
避免进行完整排序。这将减少查找从if let va = values["LMN9xAUOcgsw4c6GJb4"] as? [String:Any] {
if let users = va["users"] as? [String:Any] {
if let user = users["user5"] as? String {
print(user)
}
}
}
到O(nlogn)
的三个最大值的时间复杂度,这将在大型DataFrame上产生巨大差异:
O(n)
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
答案 1 :(得分:3)
使用基础的np
数组(使用df.values
),使用np.sort
对每一行进行排序,并对最后三列求和(这将是每行的3个最大值):
>>> df
0 1 2 3 4
0 591949 2575703 22479693 2202865 499835
1 2705 11426 339913 5438 1016
2 18 119 4162 18 0
3 264 1213 14999 246 116
4 0 35 1292 10 0
5 0 0 1442 0 0
6 0 28 5596 20 0
7 0 10 102 56 0
8 33 0 1224 17 0
9 39 198 9505 62 35
>>> df['Sum_max_3'] = np.sum(np.sort(df.values)[:,-3:],axis=1)
>>> df
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