Python列表中的Pandas布尔运算

7

我了解Pandas数据框类型具有测试其值逻辑的能力。

以下是代码:

import pandas as pd
data = pd.DataFrame(columns=['a', 'b', 'c'])
data = data.append({'a': 'I have data', 'b': 'no more complexe', 'c': 024204}, ignore_index=True)
data = data.append({'a': 'audoausd', 'b': '2048rafaf', 'c': 29313}, ignore_index=True)
data = data.append({'a': 'koplak ente gan', 'b': 'ente g bisa koplak', 'c': 29313}, ignore_index=True)

现在我们有以下数据框:

                 a                   b      c
0      I have data    no more complexe  10372
1         audoausd           2048rafaf  29313
2  koplak ente gan  ente g bisa koplak  29313

测试列c的逻辑值并将其保存到变量中

c = data.c > 20000

将把c设置为以下值

0    False
1     True
2     True
Name: c, dtype: bool

测试列B的逻辑值并将其保存到一个变量中

b = data.b.str.contains('koplak')

b value

0    False
1    False
2     True
Name: b, dtype: bool

并且对于列a也是如此

a = data.a.str.contains('koplak')

一个值

0    False
1    False
2     True
Name: b, dtype: bool

当我通过执行a&b&c来比较所有这些值时,将返回:
0    False
1    False
2     True
dtype: bool

如果涉及多列,硬编码并不是一种好的方式,因此我尝试制作一个包含所有列逻辑的列表。

logic = [a, b, c]

如何自动比较所有项目以获得 A、B、C 的结果?

1个回答

12

a & b & c 的含义等同于

import functools
print(functools.reduce(lambda x,y: x & y, [a, b, c]))

产生的结果

0    False
1    False
2     True
dtype: bool
与我原来下面的答案不同(建议使用np.logical_and.reduce),我相信functools.reduce(lambda x,y:x&y,[a,b,c])将忠实地返回与a&b&c相同的Series。

(在Python2.7中,reduce是一个内置函数。 functools.reducereduce是相同的函数。 在Python3中,reduce从内置函数中删除,只剩下functools.reduce。 因此,为了使您的代码具有未来可扩展性,请使用functools.reduce。)


编辑:在某些情况下,使用np.logical_and.reduce([logic])可能无法正常工作。 这是一个反例:

import pandas as pd
import numpy as np
x = pd.Series([True,True,False,False], index=[1,2,3,4]) 
y = pd.Series([True,True,False,False], index=[1,2,3,4]) 
print(x & y)

打印

1     True
2     True
3    False
4    False
dtype: bool

但是np.logical_and.reduce([x,y])会引发ValueError错误。

    print(np.logical_and.reduce([x,y]))
  File "/data1/unutbu/.virtualenvs/dev/local/lib/python2.7/site-packages/pandas-0.13.0_98_gd9b0c1f-py2.7-linux-i686.egg/pandas/core/generic.py", line 665, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这非常有用;你能否提交一个PR以添加到食谱中?你可以使用这个链接和一个漂亮的标题/描述。 - Jeff
我曾经遇到过同样的问题,但是使用逻辑或(|)时,我想到了 sum(my_list_of_serieses).astype(bool) - xjcl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接