从Python中的平均计算中消除某些值

时间:2014-05-16 15:27:08

标签: python python-2.7 mean

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

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变量要满足,但它似乎没有这样做,有什么建议吗?

2 个答案:

答案 0 :(得分:2)

你的双重条件效果很好(正如你在那里放一些印刷语句时所看到的那样);问题是,在for循环的每次迭代中,您仍计算整个 cols列表的平均值。

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

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

答案 1 :(得分:0)

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

" Wes McKinney是个天才。如果你正在实施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