在大熊猫数据帧的行删除最高和最低值

问题描述 投票:1回答:2

我有包含的100只股票篮子每小时回报数据帧。有一件事我目前计算为每股票每小时的平均回报,然后取这个数字的滚动MA。因此,我通过100总结每一行,并划分,做滚动平均值之前。可以说,东风看起来像这样的例子:

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)

所以,我有这个没有问题,我想现在不过做的事情,为t下降了5只最高和最低执行股票对每一行,然后由90这段时间进行行的总和,和鸿沟。

如果它只是一个栏,我只是对它进行排序,然后就分析它,带走的顶部和底部5.但是,由于我做的这行我Calcs(计算)不知道我是否可以使用相同的原理。

任何帮助将不胜感激。

python pandas dataframe slice
2个回答
2
投票

首先由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]

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
© www.soinside.com 2019 - 2024. All rights reserved.