Python 列表中的 Pandas 布尔运算

问题描述 投票:0回答:2

我知道 pandas dataframe 类型能够测试其值的逻辑。

这是代码:

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值

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 结果?

python python-2.7 pandas
2个回答
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
相同的系列。

(在Python2.7中,

reduce
是内置函数。
functools.reduce
reduce
是相同的函数。在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().

0
投票

我会用

np.all()

import pandas as pd
import numpy as np

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 = data.a.str.contains('koplak')
b = data.b.str.contains('koplak')
c = data.c > 20000

logic = [a, b, c]

result = np.all(logic, axis=0)
© www.soinside.com 2019 - 2024. All rights reserved.