在熊猫数据框行中删除最高和最低值

时间:2019-02-10 11:14:13

标签: python pandas dataframe slice

我有一个数据框,其中包含一篮子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。但是,鉴于我正在对行进行这些计算,因此我不知道是否可以使用相同的原理。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

首先按numpy.sort对每行的值进行排序,选择所有不包括前5名和后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]

答案 1 :(得分:1)

解决此问题的一种方法是使用argmax中的Numpy函数,并用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