我有一些csv文件,如:
Time Test Two Three Five Six Seven Eight Nine Ten Eleven Twelve Thirteen Fifteen Sixteen
0 0 0 0 0 0 0 0 0 -0.3 0 0 100 0 0
0.02 0 0 0 0 0 0 0 0 -0.1 0.05 0 99 28 0
0.04 0 0 0 0 0 0 0 0 -0.15 0.05 0.9 99.6 28.7 0
...
我的代码如下:
list_of_dfs = [pandas.read_csv(filename) for filename in filenames]
for i in list_of_dfs:
if any(x is 0 for x in i.Test):
print("true")
else:
print("false")
这显示我只是假(即使i.Test总是0)
print(list_of_dfs[0].Test)
显示
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
..
655 0
656 0
657 0
658 0
659 0
660 0
661 0
662 0
663 0
664 0
665 0
Name: Test, Length: 666, dtype: int64
不应该
any(x is 0 for x in i.Test)
总是正确的,因为我在每个i.Test最小值为“0”(因为它们只包含0)
我的错误是什么?
答案 0 :(得分:1)
问题陈述,如果我理解正确的话,是根据每个数据帧的Test
系列中是否存在0来为列表中的每个数据帧返回值。
简单地打印'true'
或'false'
可能还不够,因为您必须将这些链接回到您的数据框列表。相反,我建议使用字典来存储数据帧:
dict_of_dfs = {fn: pd.read_csv(fn) for fn in filenames}
然后,您可以使用字典理解根据您的条件将每个文件名映射到布尔值:
res = {fn: (df['test'] == 0).any() for fn, df in dict_of_dfs.items()}
然后,您可以通过迭代res.items()
或通过res['myfile.csv']
指定特定文件名来确定哪些数据框符合您的条件。
请注意,我们正在使用向量化操作,而不是一次迭代一个系列中的每个元素。这是Pandas的一个功能,它将它与您尝试过的标准Python列表理解或生成器表达方法区分开来。矢量化操作可以有效访问连续的内存块,应尽可能优先使用。