Python中筛选后列表保存为CSV文件异常问题求助
问题分析与解决方案
核心问题
你的代码存在两个关键错误导致筛选失效:
- 筛选逻辑错误:判断
x>Lower2SD or x<Upper2SD等价于所有数值都满足(任何数要么大于下限,要么小于上限),这会保留全部原始数据。正确逻辑应该是同时满足大于下限且小于上限(x > Lower2SD and x < Upper2SD)。 - 仅提取单列数据:你用
filter只提取了Area列的数值,没有保留完整的样本行数据,后续用csv模块写入时也只保存了Area值,丢失了其他列信息。
修正后的代码
直接用Pandas完成筛选和保存,更简洁高效:
import pandas as pd # 读取原始数据 data = pd.read_csv('/Users/myname/Documents/Data/MyData.csv') # 统计计算 count_row = data.shape[0] 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) Upper2SD = mean + (2 * sd) print("Mean - 2SD =", "%.2f" % Lower2SD) print("Mean + 2SD =", "%.2f" % Upper2SD) print("Mean +- 2SD = ", "%.2f" % Lower2SD, "to", "%.2f" % Upper2SD) # 筛选超出范围的数据(用于验证) below = data[data["Area"] < Lower2SD]["Area"].tolist() print("\nValue(s) of specimens below the Mean -2SD: ") print(below) above = data[data["Area"] > Upper2SD]["Area"].tolist() print("\nValue(s) of specimens exceeding the Mean +2SD: ") print(above) # 筛选符合条件的完整行数据 adjusted_data = data[(data["Area"] > Lower2SD) & (data["Area"] < Upper2SD)] print("\nNumber of specimens within 2SD: ", adjusted_data.shape[0]) # 保存完整数据到新CSV adjusted_data.to_csv('/Users/myname/Documents/Data/AdjustedData.csv', index=False, encoding='UTF8')
关键修改说明
- 修正筛选逻辑:用
(data["Area"] > Lower2SD) & (data["Area"] < Upper2SD)替代错误的or逻辑,确保只保留均值±2标准差范围内的样本。 - 保留完整行数据:直接对DataFrame进行筛选,保留所有列信息,而非仅提取Area列。
- 使用Pandas内置方法:用
to_csv直接保存筛选后的DataFrame,无需手动遍历写入,避免出错且效率更高。 - 增加验证输出:添加符合条件的样本数量统计,方便快速确认筛选结果。
内容的提问来源于stack exchange,提问作者MountainMan
相关产品推荐
相关产品推荐

