两个 pandas 数据帧的广播乘法
Broadcasting multiplication of two pandas DataFrames
我有两个DataFrame,例如:
df1 = pn.DataFrame(np.arange(6).reshape(3, 2), columns=['A1', 'B1'])
df2 = pn.DataFrame(np.arange(1,7).reshape(3, 2), columns=['A2', 'B2'])
A1 B1
0 0 1
1 2 3
2 4 5
A2 B2
0 1 2
1 3 4
2 5 6
我需要将 df1 和 df2 乘以列以获得具有以下结果的 DataFrame:
A1*A2 A1*B2 B1*A2 B1*B2
0 0 0 1 2
1 6 8 9 12
2 20 24 25 30
实际任务中 df1 和 df2 的大小为(1000 列 x 90 000 行)。
我不想在这些 DataFrame 的列之间使用双 "for" 循环。
是否有内置函数或一些简单的计算方法?
您可以使用 df.multiply() 将 df 与一个系列相乘,然后像这样连接生成的数据帧:
df3 = pd.concat([df1[["A1", "B1"]].multiply(df2["A2"], axis="index"),
df1[["A1", "B1"]].multiply(df2["B2"], axis="index")], axis = 1)
df3.columns = ['A1*A2', "B1*A2", "A1*B2", "B1*B2"]
你得到:
A1*A2 B1*A2 A1*B2 B1*B2
0 0 1 0 2
1 6 9 8 12
2 20 25 24 30
使用broadcasting
以获得高效的性能增益:
import itertools
df = pd.DataFrame((df1.values[..., None] * df2.values[:, None]).reshape(df1.shape[0],-1))
df.columns = ["*".join(i) for i in itertools.product(*[df1.columns, df2.columns])]
合并 df1.values[..., None]
的目的是在 df1.values
.
的早期 (3, 2)
形状的右侧创建一个形状为 (3, 2, 1)
的额外维度
此外,df2.values[:, None]
向中心轴添加了一个额外的维度,使其形状从最初的 (3,2)
变为 (3, 1, 2)
以帮助乘法过程。
最后,reshape
它们的行数与原来的行数相同 df1
(或) df2
(因为在提到的问题中两者具有相同的形状)。
我有两个DataFrame,例如:
df1 = pn.DataFrame(np.arange(6).reshape(3, 2), columns=['A1', 'B1'])
df2 = pn.DataFrame(np.arange(1,7).reshape(3, 2), columns=['A2', 'B2'])
A1 B1
0 0 1
1 2 3
2 4 5
A2 B2
0 1 2
1 3 4
2 5 6
我需要将 df1 和 df2 乘以列以获得具有以下结果的 DataFrame:
A1*A2 A1*B2 B1*A2 B1*B2
0 0 0 1 2
1 6 8 9 12
2 20 24 25 30
实际任务中 df1 和 df2 的大小为(1000 列 x 90 000 行)。
我不想在这些 DataFrame 的列之间使用双 "for" 循环。
是否有内置函数或一些简单的计算方法?
您可以使用 df.multiply() 将 df 与一个系列相乘,然后像这样连接生成的数据帧:
df3 = pd.concat([df1[["A1", "B1"]].multiply(df2["A2"], axis="index"),
df1[["A1", "B1"]].multiply(df2["B2"], axis="index")], axis = 1)
df3.columns = ['A1*A2', "B1*A2", "A1*B2", "B1*B2"]
你得到:
A1*A2 B1*A2 A1*B2 B1*B2
0 0 1 0 2
1 6 9 8 12
2 20 25 24 30
使用broadcasting
以获得高效的性能增益:
import itertools
df = pd.DataFrame((df1.values[..., None] * df2.values[:, None]).reshape(df1.shape[0],-1))
df.columns = ["*".join(i) for i in itertools.product(*[df1.columns, df2.columns])]
合并 df1.values[..., None]
的目的是在 df1.values
.
(3, 2)
形状的右侧创建一个形状为 (3, 2, 1)
的额外维度
此外,df2.values[:, None]
向中心轴添加了一个额外的维度,使其形状从最初的 (3,2)
变为 (3, 1, 2)
以帮助乘法过程。
最后,reshape
它们的行数与原来的行数相同 df1
(或) df2
(因为在提到的问题中两者具有相同的形状)。