pythonlis中的Pandas布尔运算

2024-10-01 13:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道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)

现在我们有了以下数据帧:

^{pr2}$

测试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')

a值

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


Tags: 数据代码namefalsetruepandasdataindex
1条回答
网友
1楼 · 发布于 2024-10-01 13:25:12

a & b & c相当于

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

它产生了

^{pr2}$

与下面我最初的回答不同(建议np.logical_and.reduce),我确信functools.reduce(lambda x,y: x & y, [a, b, c])将忠实地返回与a & b & c相同的序列。在

(在Python2.7中,reduce是一个内置函数。functools.reduce与{}是相同的函数。在Python3中,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])引发了一个值错误

    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().

相关问题 更多 >