如何 "or" DataFrame 中的每一列都包含一个向量?

How do I "or" each column in a DataFrame with a vector?

假设我有以下数据:

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)

如何"or" df 中每一列的向量?

我知道我可以使用 "or" 和我的向量创建部分函数并将其应用于 df,但这可能是不合常理的并且不必要地耗时。 pandas 方法是什么?

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

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

您可以利用 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 进行计算,因此它可能是最快的。

您可以将 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

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