用Python从均值计算中剔除某些值

2024-10-03 11:16:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算以下样本数据集的平均值:

bogie-n bypass-n    0.00304367004111
flask-n bypass-n    0.00298246799918
faggot-n    sprayer-n   0.00507314183347
bypass-n    sprayer-n   0.00136494481917
sprayer-n   sprayer-n   1.0

我想从平均值的计算中去掉任何等于1或等于0的值。 为此,我编写了以下代码:

with open(infile) as f:
    cols = [float(row.split("\t")[2]) for row in f.readlines()]
    for col in cols:
        if col == 1 or col == 0:
            pass
        else:
            normalizedDataEuc = float(sum(cols))/float(len(cols))
            output = infile + "\t" + str(normalizedDataEuc) + "\n"
            print output

这段代码成功地计算了整个数据集的平均值(在上面的示例数据中是0.202492845),但是在排除1的值(即0.202492845)时,它无法计算数据集的平均值。你知道吗

我试图实现一个双条件,col变量要满足这个条件,但它似乎没有这样做,有什么建议吗?你知道吗


Tags: 数据代码inforoutputcolfloat条件
2条回答

您的双重条件工作得很好(当您在其中放入一些print语句时可以看到);问题是在for循环的每次迭代中,您都会计算整个cols列表的平均值。你知道吗

相反,您应该过滤cols列表以删除10值,然后计算过滤列表的平均值(只有这两行,没有循环):

>>> filtered = [col for col in cols if col not in [0, 1]]
>>> sum(filtered) / float(len(filtered))
0.00311605617323

http://blog.explainmydata.com/2012/07/expensive-lessons-in-python-performance.html

“韦斯·麦金尼是个天才。如果你正在实现Wes McKinney已经放在他的库中的任何东西,就停下来。他的代码比你要写的任何东西都更快,更健壮,更可能是正确的。想要滚动窗口聚合器吗?使用熊猫。需要处理丢失的数据吗?使用熊猫。你是不是在写一个令人难以置信的丑陋的黑客,试图实现连接和分组比的过NumPy数组,但实际上花了3个小时计算一个微妙的不正确的结果?(我已经这样做了)。天哪,停下来用熊猫。”

我同意这一点。就用熊猫吧。这是毫无意义的重做已经做了以前和更多的人和优化的性能。你知道吗

解决方案:

import pandas as pd

s="""bogie-n bypass-n    0.00304367004111
     ...: flask-n bypass-n    0.00298246799918
     ...: faggot-n    sprayer-n   0.00507314183347
     ...: bypass-n    sprayer-n   0.00136494481917
     ...: sprayer-n   sprayer-n   1.0"""

lines = [x.split() for x in s.split('\n')]

lines
Out[152]:
[['bogie-n', 'bypass-n', '0.00304367004111'],
 ['flask-n', 'bypass-n', '0.00298246799918'],
 ['faggot-n', 'sprayer-n', '0.00507314183347'],
 ['bypass-n', 'sprayer-n', '0.00136494481917'],
 ['sprayer-n', 'sprayer-n', '1.0']]

df = pd.DataFrame(lines)

df
Out[154]:
           0          1                 2
0    bogie-n   bypass-n  0.00304367004111
1    flask-n   bypass-n  0.00298246799918
2   faggot-n  sprayer-n  0.00507314183347
3   bypass-n  sprayer-n  0.00136494481917
4  sprayer-n  sprayer-n               1.0



df[2] = df[2].astype(float)

df
Out[163]:
           0          1         2
0    bogie-n   bypass-n  0.003044
1    flask-n   bypass-n  0.002982
2   faggot-n  sprayer-n  0.005073
3   bypass-n  sprayer-n  0.001365
4  sprayer-n  sprayer-n  1.000000



df[df[2] != 1.0]
Out[164]:
          0          1         2
0   bogie-n   bypass-n  0.003044
1   flask-n   bypass-n  0.002982
2  faggot-n  sprayer-n  0.005073
3  bypass-n  sprayer-n  0.001365

相关问题 更多 >