熊猫:每行最多3列的值之和

时间:2018-09-16 20:47:30

标签: python pandas

样本数据:

        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)都是不同的列。

我有很多列,所以我需要对所有列自动执行。

2 个答案:

答案 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