检查Python DataFrame中的任何值是否为0

时间:2018-06-12 21:33:35

标签: python pandas

我有一些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)

我的错误是什么?

1 个答案:

答案 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列表理解或生成器表达方法区分开来。矢量化操作可以有效访问连续的内存块,应尽可能优先使用。