【问题标题】:Dropping highest and lowest values in a pandas dataframe row删除熊猫数据框行中的最高值和最低值
【发布时间】:2019-07-04 01:49:12
【问题描述】:

我有一个数据框,其中包含一篮子 100 只股票的每小时收益。我目前计算的一件事是每小时每只股票的平均回报,然后取这个数字的滚动 MA。所以我在做滚动平均值之前对每一行求和,然后除以 100。假设 df 看起来像这样:

Time   Stock 1   Stock 2   Stock 3   Stock 4 ... Stock 100
09:00  0.25      0.14      0.07      0.31        0.12
10:00  0.05      0.01      -0.03     0.18        0.09
11:00  -0.11     -0.17     0.01      -0.04       -0.13
12:00  -0.22     -0.31     -0.19     -0.34       -0.16
13:00  0.02      0.05      0.09      0.11        0.08

所以我要计算每一行的平均值是:

df['Average'] = (df.sum(axis=1)/100)

所以我没有这个问题,但是我现在要做的事情是,不要删除每行表现最高和最低的 5 只股票,然后执行该行的总和,这次除以 90。

如果它只是一个列,我会对其进行排序,然后对其进行切片,以去除顶部和底部 5。但是,鉴于我正在对行进行这些计算,我不知道我是否可以使用相同的原则。

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas dataframe slice


    【解决方案1】:

    首先按numpy.sort 对每行的值进行排序,选择所有没有第一个和最后一个 5 的列以及每行最后一个计数mean

    np.random.seed(2019)
    
    df = pd.DataFrame(np.random.randint(10, size=(5, 12)))
    print (df)
       0   1   2   3   4   5   6   7   8   9   10  11
    0   8   2   5   8   6   8   0   0   7   8   5   3
    1   0   2   5   7   8   5   4   0   1   6   0   2
    2   6   6   3   1   3   5   0   2   6   1   8   2
    3   9   8   3   7   7   7   0   3   4   8   1   0
    4   6   1   8   2   3   0   9   2   9   8   5   5
    
    print (np.sort(df.values, axis=1))
    [[0 0 2 3 5 5 6 7 8 8 8 8]
     [0 0 0 1 2 2 4 5 5 6 7 8]
     [0 1 1 2 2 3 3 5 6 6 6 8]
     [0 0 1 3 3 4 7 7 7 8 8 9]
     [0 1 2 2 3 5 5 6 8 8 9 9]]
    
    print (np.sort(df.values, axis=1)[:, 5:-5])
    [[5 6]
     [2 4]
     [3 3]
     [4 7]
     [5 5]]
    
    df['average'] = np.mean(np.sort(df.values, axis=1)[:, 5:-5], axis=1)
    print (df)
       0  1  2  3  4  5  ...  7  8  9  10  11  average
    0  8  2  5  8  6  8  ...  0  7  8   5   3      5.5
    1  0  2  5  7  8  5  ...  0  1  6   0   2      3.0
    2  6  6  3  1  3  5  ...  2  6  1   8   2      3.0
    3  9  8  3  7  7  7  ...  3  4  8   1   0      5.5
    4  6  1  8  2  3  0  ...  2  9  8   5   5      5.0
    
    [5 rows x 13 columns]
    

    【讨论】:

      【解决方案2】:

      解决此问题的一种方法是使用Numpy 中的argmax 函数,并用np.NaN 反复替换连续前5 个最大值。在下面的代码中,我生成了一个和你类似的案例:

      import numpy as np
      stock = {}
      for i in range(100):
          stock['Stock_' + str(i)] = np.random.rand(10)
      
      df = pd.DataFrame.from_dict(stock)
      
      for row in df.values:
          for i in range(5):
              row[np.argmax(row)] = np.NaN
      

      【讨论】:

        猜你喜欢
        • 2016-05-07
        • 2017-07-25
        • 2020-08-06
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        相关资源
        最近更新 更多