2016-07-09 48 views
3

我对Python和这个社区相当陌生,所以请原谅我的业余尝试来解释我对最可能非常明显的事情的深刻理解。无论如何..在通过.xs进行切片时使用multiIndex DataFrame上的any()和all():奇怪的行为还是仅仅是我?

我有一个数据框称为“数据”。它由多个索引组成,包括“日期”和“屁”。

有一列叫做“integrated_daily_difference”。

你可以假设“屁”的类型为:“pandas.core.index.Index”,并通过创建: farts = data.index.levels[1]

现在,让我们想象一下,我想带我的数据帧的切片视图在任意在屁索引值:即屁[1]

我:

data.xs(farts[1], level = 1) 

计算机:

    integrated_daily_difference 
     date  
2015-05-21 00:00:00+00:00 0.000000 
2015-05-22 00:00:00+00:00 0.000000 
2015-05-26 00:00:00+00:00 -0.024497 
2015-05-27 00:00:00+00:00 -0.051144 
2015-05-28 00:00:00+00:00 -0.079841 
2015-05-29 00:00:00+00:00 -0.106666 
2015-06-01 00:00:00+00:00 -0.131245 
2015-06-02 00:00:00+00:00 -0.157428 
2015-06-03 00:00:00+00:00 -0.184057 
2015-06-04 00:00:00+00:00 -0.209755 
2015-06-05 00:00:00+00:00 -0.234588 
2015-06-08 00:00:00+00:00 -0.262365 
2015-06-09 00:00:00+00:00 -0.291890 
2015-06-10 00:00:00+00:00 -0.320943 
2015-06-11 00:00:00+00:00 -0.352627 
2015-06-12 00:00:00+00:00 -0.381425 
2015-06-15 00:00:00+00:00 -0.404055 

我:

data.xs(farts[1], level = 1) < 0 

计算机:

   integrated_daily_difference 
     date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 True 
2015-05-27 00:00:00+00:00 True 
2015-05-28 00:00:00+00:00 True 
2015-05-29 00:00:00+00:00 True 
2015-06-01 00:00:00+00:00 True 
2015-06-02 00:00:00+00:00 True 
2015-06-03 00:00:00+00:00 True 
2015-06-04 00:00:00+00:00 True 
2015-06-05 00:00:00+00:00 True 
2015-06-08 00:00:00+00:00 True 
2015-06-09 00:00:00+00:00 True 
2015-06-10 00:00:00+00:00 True 
2015-06-11 00:00:00+00:00 True 
2015-06-12 00:00:00+00:00 True 
2015-06-15 00:00:00+00:00 True 

我认为这将返回无论是否在任何地点存在我的数据框片内的值,因此结果是真实的吗?

我:

data.xs(farts[1], level = 1).any() 

计算机:

integrated_daily_difference True 
dtype: bool 

OK,这都挺有道理。现在的怪异的东西..

我:

data.xs(farts[1], level = 1).any() < 0 

计算机:

integrated_daily_difference False 
dtype: bool 

咦......?

我:

data.xs(farts[1], level = 1).any(axis = 0) < 0 

计算机:

integrated_daily_difference False 
dtype: bool 

我:

data.xs(farts[1], level = 1).any(axis = 1) < 0 

计算机:

 date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 

我:

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

计算机:

 date 
2015-05-21 00:00:00+00:00  True 
2015-05-22 00:00:00+00:00  True 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 

我:

data.xs(farts[1], level = 1).any(axis = 0) <= 0 

计算机:

integrated_daily_difference False 
dtype: bool 

然后我的电脑开始狂笑在我和我的头爆炸...

但更严重的是,这里发生了什么?我的目标是试图检查单列数据框中的全部或任何值是否满足条件并返回布尔值True或False。我似乎没有正确使用任何(),所以我正在寻求帮助。

任何输入表示赞赏。先谢谢你!

回答

2

首先让我定义什么任何手段根据pandas-

返回的文档的任何元素是否真在申请轴

现在,当你写的 -

data.xs(farts[1], level = 1).any() 

它只是检查是否有任何值是真的,因为没有条件gi它只会检查数字,这意味着0将被视为False,而其他任何数字都将被视为True。现在作为还有其他数字表示0,它返回True。

现在你检查 -

data.xs(farts[1], level = 1).any() < 0 

,但真正为1,假为0时,作为整数表示,因此返回False作为输出data.xs(farts[1], level = 1).any()是真哪个是1。所以,如果你检查

data.xs(farts[1], level = 1).any() == 1 

它会返回True。

现在让我们看看当你这样做会发生什么 -

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

首先,你已经改变了轴,现在data.xs(farts[1], level = 1).any(axis = 1)回报只是Trues和Falses根据值(真/ 1比0和假其它值/ 0代表0的值)。现在前两个值为0s /假并满足条件“< = 0”它给你你看到的输出。试试看 -

data.xs(farts[1], level = 1).any(axis = 1) == 1 

你会得到相反的输出。

与any()相反,all()的工作方式不同...如果all均为True或all均为False,则返回true否则它只返回False。

而只提 -

anyor OR alland不是你想象的一样.... 或和和是位操作他们也跟着short circuit evaluation但是任何与所有这一切都是他们将走过所有条件的功能。

希望它能帮助:)

+0

这非常有帮助。谢谢!我实际上做了更深入的尝试,并尝试了以下内容:mylist = [1,2,3,4,0,-1] print'test 1:',all(mylist)> -1 print'test 2:',所有(对于mylist中的i> -1)测试1打印为True并且测试2打印为False。我假设这是由于True(1)和False(0)对于第一种情况都大于-1,并且当在发生器中进行评估时它的行为有所不同。 –

+0

让我们先尝试一下,'all(mylist) '再次没有条件,但是当列表包含0时,它会返回False,它的数值为0,那么为什么当用“> -1”测试时它会返回True。 – hashcode55

+0

,在第二个中,您正在测试一组布尔值! i> -1将返回False为-1,这将导致整体False,尝试> = -1,您将变为True!它只是你必须牢记的基本概念.....“如果迭代的任何元素都是真的,则返回True。” - 对于任何和“返回True,如果迭代的所有元素都是真的” - 对于所有 – hashcode55

3

考虑一个简单的系列:

import numpy as np 
np.random.seed(0) 
ser = pd.Series(np.random.randint(0, 3, 10)) 

ser 
Out[78]: 
0 0 
1 1 
2 0 
3 1 
4 1 
5 2 
6 0 
7 2 
8 0 
9 0 
dtype: int32 

比方说,你想要做的比较ser < 2,它会返回一个布尔值数组:

ser < 2 
Out[79]: 
0  True 
1  True 
2  True 
3  True 
4  True 
5 False 
6  True 
7 False 
8  True 
9  True 
dtype: bool 

现在,如果你想检查它们是否小于2,你需要在这个数组上调用any

(ser < 2).any() 
Out[81]: True 

这将返回True如果在ser < 2数组中的值中的至少一个是True.all()是相似的:

(ser < 2).all() 
Out[82]: False 

因为不是所有的人都是真实的,它返回False。如果您将其更改为:

(ser < 3).all() 
Out[83]: True 

因为它检查(ser < 3)阵列和阵列中的所有元素都True

现在让我们尝试ser.any()

ser.any() 
Out[84]: True 

在这里,你正在检查是否有任何数组中的值是True(如果为0是真,如果1为真等)。这个数组中的值是整数,而不是布尔值。如果它们不等于0,则它们被评估为True。因此,由于该数组中至少有一个非零,它将返回True。现在

,如果我检查ser.any() < 0将返回False

ser.any() < 0 
Out[85]: False 

正是因为这个表达式True < 0

True < 0 
Out[86]: False 

这是因为FalseTrue不小于0是什么你在做的是类似的:

data.xs(farts[1], level = 1).any() < 0 

它首先在该部分执行any(),并返回True,因为该部分具有非零元素。如果你确实要检查他们中是否是小于0,应键入:

(data.xs(farts[1], level = 1) < 0).any() 

(data.xs(farts[1], level = 1) < 0)将创建一个布尔数组,如果任何数组中的元素是True.any()将返回True以及。

+0

感谢您的答复。很有帮助 :) –

相关问题