如何 "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;如果愿意,您可以转换回数字数据类型。
假设我有以下数据:
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;如果愿意,您可以转换回数字数据类型。