在数据框中查找值在x和y之间的单元格

时间:2016-09-29 09:44:25

标签: python pandas

我希望pandas数据框中的所有值都为True / False,具体取决于值是否在给定的x和y之间。

使用'AND'运算符组合2个数据帧,或者任何来自pandas的'between'功能组合都会很好。我宁愿不循环遍历列并调用pandas.Series.between(x,y)函数。

示例

给出以下数据框

>>> df = pd.DataFrame([{1:1,2:2,3:6},{1:9,2:9,3:10}])
>>> df
   1  2   3
0  1  2   6
1  9  9  10

我想要x和y之间的所有值。例如,我可以从:

开始
>>> df > 2
       1      2     3
0  False  False  True
1   True   True  True

然后再做

>>> df < 10
      1     2      3
0  True  True   True
1  True  True  False

但是

>>> df > 2 and df < 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Laurens Koppenol\Anaconda2\lib\site-packages\pandas\core\generic.py", line 731, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

2 个答案:

答案 0 :(得分:4)

&与括号一起使用(由于运算符优先级),and并不了解如何处理布尔数组,因此警告:

In [64]:
df = pd.DataFrame([{1:1,2:2,3:6},{1:9,2:9,3:10}])
(df > 2) & (df < 10)

Out[64]:
       1      2      3
0  False  False   True
1   True   True  False

可以将betweenapply一起使用,但对于大型df来说这会更慢:

In [66]:
df.apply(lambda x: x.between(2,10, inclusive=False))

Out[66]:
       1      2      3
0  False  False   True
1   True   True  False

请注意,每当您尝试使用andornot比较df或系列时,都会引发此警告,您应该使用&,{{ 1}}和|分别为这些按位运算符理解如何正确处理数组

答案 1 :(得分:0)

between是一种方便的方法。但是,它仅适用于系列对象。我们可以通过使用apply来解决这个问题,stack对每一行(或列)进行操作。或者,将数据帧重新整理为包含stack

的系列

使用betweenunstackdf.stack().between(2, 10, inclusive=False).unstack()

{
  "aps":{
          "alert": {
                    "body": "My Push Notification", 
                    "title" : "Notification title"},
          "mutable-content" : 1,
          "badge":0},
}

enter image description here