首页 > 解决方案 > 如何从三个 pandas 列中获得第 3 到第 7 最高选择的平均值?

问题描述

id      MaxS        MaxA    MaxD    
43290   9.511364    2.70    0.27    
43290   7.547727    2.56    0.34    
43290   7.465909    2.66    0.48    
43290   7.404545    3.90    0.60    
43290   7.772727    2.38    0.11    
43290   7.936364    2.62    0.97    
43290   7.650000    4.20    1.64    
43290   3.088636    1.79    0.06    
43290   4.377273    2.19    0.05    
43290   6.750000    4.65    1.90    
43290   5.461364    2.82    0.19    
43290   7.363636    4.13    1.48    
43290   11.270455   3.72    0.41    
43290   10.186364   3.88    1.17    
43290   3.109091    2.05    0.02    
43290   7.834091    3.38    0.01    
43290   3.252273    2.31    0.03    
43290   7.854545    3.00    0.70    
43290   9.756818    3.26    0.54    
43290   6.954545    2.93    0.24    
43291   4.070455    1.21    0.21    
43291   6.034091    3.42    0.42    
43291   8.018182    2.41    0.66    
43291   7.956818    3.55    0.62    
43291   8.161364    2.74    0.64    
43291   8.263636    4.11    0.13    
43291   2.618182    1.80    0.08    
43291   2.168182    2.12    0.04    
43291   6.095455    3.04    0.11    
43291   9.061364    2.91    0.33    
45880   5.236364    2.43    0.15    
45880   14.972727   4.86    0.23    
45880   9.593182    4.48    1.36    
45880   4.459091    3.67    0.14    
45880   17.325000   4.21    0.44    
45880   11.086364   3.30    1.00    
45880   5.277273    2.25    0.12    
45880   7.547727    2.92    0.34    
45880   11.270455   3.33    0.03    
45880   13.990909   3.21    0.50    
45880   9.122727    3.86    1.14    
45880   6.790909    4.24    1.30    
45880   8.100000    4.31    0.80    
45880   5.809091    3.22    0.94    
45881   6.565909    3.50    0.86    
45881   10.452273   4.64    0.85    
45881   7.281818    3.47    0.71    
45881   9.347727    3.67    0.02    
45881   14.318182   3.97    0.51    
45881   5.481818    3.99    0.21    
45881   7.425000    3.93    1.65    
45881   8.836364    3.50    0.26    
45881   5.277273    2.21    0.57    
45881   12.865909   4.38    0.94    
45881   7.200000    2.86    0.45    
45881   7.138636    4.39    1.18    
45881   8.815909    4.34    0.34    
45881   9.490909    4.53    0.28    
45881   17.652273   4.59    0.05    
45881   11.106818   2.64    0.31    
45881   9.511364    3.83    1.14    
45881   8.284091    3.90    0.20    
45881   9.306818    3.54    0.22    
45881   5.195455    2.66    0.14    
45881   3.477273    2.50    0.16    
45881   7.179545    3.70    0.08    
45881   8.447727    3.19    0.32    
45881   4.990909    2.32    0.86    
45881   16.465909   4.28    0.25    

大家好,如您所见,我在熊猫数据框中有上面的表格。我想要做的是对于每个 ID,我最想要 MaxS、MaxA 和 MaxD 的第 3 到第 7,并且我想取它们的平均值。我知道您可以使用 head 或 nlargest 来获得这些列中最多的数字,但我不确定如何获得每个 ID 的第三到第七。此外,如果您在多列上尝试 nlargest,pandas 会引发错误。所以我不确定如何处理这个问题。

如果有人能帮我找到每个 id 的三列(MaxS、MaxA 和 MaxD)中第三大到第七大数字的平均值,我将不胜感激。

谢谢!

标签: pythonpandasgroup-by

解决方案


将数据框列转换为numpy 数组可以工作:

import pandas as pd
import numpy as np

def _get_average(column):
    """ perform sort, reverse and get 3rd to 7th values to average """
    return np.mean(np.sort(column.to_numpy())[::-1][3:8])

def average_csv():
    """ read data as csv and average the desired fields """
    my_df = pd.read_csv("my_csv.csv", delimiter="\s+")
    return _get_average(my_df["MaxS"]), _get_average(my_df["MaxA"]), _get_average(my_df["MaxD"])

if __name__ == "__main__":
    print("MaxS: {}, MaxA: {}, MaxD: {}".format(*average_csv()))


推荐阅读