2017-09-04 42 views
3

我有两个dataframes df1df2如下不一致的行为数据帧

>>> df1 = pd.DataFrame([[1,2],[3,4],[5,6],[7,8]]) 
>>> df2 = pd.DataFrame([1,2,3,4,5,6,7,8]) 
>>> df1 
    0 1 
0 1 2 
1 3 4 
2 5 6 
3 7 8 
>>> df2 
    0 
0 1 
1 2 
2 3 
3 4 
4 5 
5 6 
6 7 
7 8 

当试图检查是否1df1,它产生真正符合市场预期。

>>> any(df1 == 1) 
True 

然而,试图在df2相同的时候,我得到的,出乎意料的是,False

>>> any(df2 == 1) 
False 

尽管从布尔角度一切似乎是正确的。

>>> df1 == 1 
     0  1 
0 True False 
1 False False 
2 False False 
3 False False 
>>> df2 == 1 
     0 
0 True 
1 False 
2 False 
3 False 
4 False 
5 False 
6 False 
7 False 
>>> 

任何想法是为什么?

PS:我不是在问大熊猫的任何功能。我对任何的行为感到困惑。

+0

我认为最好是利用熊猫功能'打印((DF2 == 1).ANY())''0真 D型:bool' – jezrael

+0

@jezrael感谢您回应。我知道任何熊猫,我只是对任何行为感到困惑!你能帮助澄清含糊不清吗? – MedAli

+1

难题,也许是bug(或尚未实现)。我不知道。 – jezrael

回答

6

需要使用内置any代替any大熊猫从基部的Python:

df1.eq(1).any().any() 
# True 

df2.eq(1).any().any() 
# True 

当使用从蟒any,它把该数据帧作为可迭代/字典,从而只检查列名称,而不查看数据框的值;如果你只是通过df1df2循环,你可以看到它只返回列名,这是字典的行为方式;由于df1包含01的列名,因此any([0,1])将返回True;另一方面,df2仅包含[0]的一列,any([0])返回False。所以any(df == 1)是有点相当于any(df)any(df.columns)

[x for x in df1] 
# [0, 1] 

[x for x in df2] 
# [0] 
+0

“.any()。any()'在这里有什么用处对不起?我使用'.any()'得到了正确的答案,因此如果它们相同或不相同(似乎是.any()。any()'去除dtype的报告)的唯一区别。 – roganjosh

+1

@roganjosh'.any()。any()'将基于数据框中的所有值返回“True”或“False”。而'.any()'返回特定结果列。 – Psidom

2

您需要使用(df2 == 1).any(),而不是

+0

upvoting为推荐使用本机功能 – MedAli

3

在大熊猫更好地使用DataFrame.any

numpy的解决方案:

print ((df1 == 1).values.any()) 
True 
print ((df2 == 1).values.any()) 
True 
+0

upvoting为推荐使用本机功能 – MedAli