假设我有两个形状相同的 Pandas DataFrame,我想生成一个 Series,它是两个 DataFrame 的行(考虑使用 pandas.DataFrame.apply)点积。
因此,例如:
df1 = pd.DataFrame(np.random.rand(1000,10))
df2 = pd.DataFrame(np.random.rand(1000,10))
df1.apply(np.dot, axis=1, args=[df2.ix[???]]
Run Code Online (Sandbox Code Playgroud)
是否有一种紧凑的矢量化方法可以在不连接到一个 DataFrame 并定义一些自定义函数的情况下执行此操作?我相信这很困难,因为我无法隐式索引df2对应于df1.
您可以将两个 DataFrame 相乘,然后求和axis=1:
df1 = pd.DataFrame(np.random.rand(1000,10))
df2 = pd.DataFrame(np.random.rand(1000,10))
result = (df1*df2).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)
请注意,当您将两个 DataFrame 相乘时,Pandas 会根据索引对齐行。这需要时间。如果值已经对齐,那么您可以下拉到 NumPy 并使用
result = (df1.values * df2.values).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)
或者
result = np.einsum('ij,ij->i', df1.values, df2.values)
Run Code Online (Sandbox Code Playgroud)
这更快,因为不需要首先根据索引对齐行。
In [10]: %timeit (df1*df2).sum(axis=1)
1000 loops, best of 3: 379 µs per loop
In [11]: %timeit (df1.values * df2.values).sum(axis=1)
10000 loops, best of 3: 49.8 µs per loop
In [14]: %timeit np.einsum('ij,ij->i', df1.values, df2.values)
10000 loops, best of 3: 30 µs per loop
Run Code Online (Sandbox Code Playgroud)
(df1.values * df2.values).sum(axis=1)返回一维 NumPy 数组。df1使用与您将使用的索引相同的索引制作系列
pd.Series(np.einsum('ij,ij->i', df1.values, df2.values), index=df1.index)
Run Code Online (Sandbox Code Playgroud)