我有一个 CSV 文件,其中包含示例对象的测量值。我已经能够使用 Pandas 和 Python 统计模块来过滤列表。然后,我尝试排除与平均值小于 2 个标准差或大于 2 个标准差的对象,然后将最终列表保存到新的 csv 文件中。 shell 的打印输出确认过滤和统计计算是否按预期工作。但是,新的 CSV 文件仍然包含所有原始对象。
我已尝试研究该问题,但尚未确定我犯了什么错误或如何修复它。将不胜感激任何帮助。
以下是我的代码:
import statistics
import pandas as pd
import csv
data = pd.read_csv('/Users/myname/Documents/Data/MyData.csv')
count_row = data.shape[0] # Gives number of rows (items)
print ("N =", count_row)
mean = data["Area"].mean().round(2)
print ("Average = ", mean)
sd = data["Area"].std().round(2)
print("SD =", sd)
Lower2SD = mean - (2*sd)
print ("Mean - 2SD =","%.2f" % Lower2SD)
Upper2SD = mean + (2*sd)
print ("Mean + 2SD =","%.2f" % Upper2SD)
print ("Mean +- 2SD = ","%.2f" %Lower2SD, "to", "%.2f" % Upper2SD)
new =list(filter(lambda x: x<Lower2SD, data["Area"]))
print()
print("Value(s) of specimens below the Mean -2SD: ")
print(new)
new =list(filter(lambda x: x>Upper2SD, data["Area"]))
print()
print("Value(s) of specimens exceeding the Mean +2SD: ")
print(new)
adjusted=list(filter(lambda x: x>Lower2SD or x<Upper2SD, data["Area"]))
print()
print("Value(s) of specimens within 2SD: ")
print(adjusted)
global header
header = ["Area"]
with open('/Users/myname/Documents/Data/AdjustedData.csv', 'a', encoding='UTF8', newline='') as f:
writer = csv.writer(f)
writer.writerow(header)
for i in adjusted:
writer.writerow([i])
x>Lower2SD or x<Upper2SD
这个情况就是问题所在。
如果分数非常低,则
x<Upper2SD
为真,因此将包含在过滤列表中。
如果分数非常高,则
x>Lower2SD
为真,因此将包含在过滤列表中。
我认为你想要的是
and
条件,而不是 or
。