【问题标题】:Pandas Boolean Operation in a Python ListPython 列表中的 Pandas 布尔运算
【发布时间】:2014-01-30 05:58:23
【问题描述】:

我了解 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 值

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


    【解决方案1】:

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

    【讨论】:

    • 这非常有用;你可以做一个公关来添加到食谱吗?您可以将此链接与一个不错的标题/描述一起使用
    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 2016-08-16
    • 1970-01-01
    • 2018-03-27
    • 2017-09-28
    • 2015-06-28
    • 2014-02-20
    相关资源
    最近更新 更多