假设我有以下数据:
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)
...
答案 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进行计算,因此可能是最快的。