如何使用向量“或”数据框架中的每个列?

时间:2015-08-06 18:39:52

标签: python pandas dataframe logical-operators

假设我有以下数据:

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO
import pandas as pd
from numpy import uint8

vector = pd.Series([1, 0, 0, 1])

df = pd.read_table(StringIO("""a    b    c
1   0   0
1   1   1
0   1   1
1   1   0"""), sep="\s+", dtype=uint8, header=0)

如何“或”df中每列的向量?

我知道我可以使用“或”和我的矢量制作部分功能并将其应用到df,但这可能是单一的,并且不必要地耗费时间。什么是熊猫的方式?

想想看,惯用的方式可能是一个lambda ...这个没有二元运算符,比如dataframe.div(series)吗? (Binary DF operations

我想要dataframe.or(vector) ...

2 个答案:

答案 0 :(得分:2)

您可以将DataFrame和(列)向量直接传递给np.logical_or

>>> np.logical_or(df, vector[:, None])
       a     b     c
0   True  True  True
1   True  True  True
2  False  True  True
3   True  True  True

请注意,这会返回一个布尔值的DataFrame;如果您愿意,可以转换回数值数据类型。

答案 1 :(得分:1)

你可以利用numpy的广播,对基础的numpy数组(df.values)进行按位或按位:

import numpy as np
new_values = df.values.astype(bool) | vector.values[:,np.newaxis].astype(bool)

这会产生一个numpy数组,而不是数据帧,但您可以轻松地重新构建数据帧:

new_df = pd.DataFrame(new_values, columns = df.columns)

由于这种方法直接让numpy进行计算,因此可能是最快的。