【问题标题】:Broadcasting multiplication of two pandas DataFrames广播两个熊猫数据帧的乘法
【发布时间】:2017-02-14 18:12:07
【问题描述】:

我有两个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”循环。

是否有内置函数或一些简单的计算方法?

【问题讨论】:

  • 它看起来像一个多项式,包含不同数据帧的列,但不是单个数据帧的列

标签: python pandas dataframe matrix-multiplication broadcasting


【解决方案1】:

使用 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] 的目的是在右侧创建一个额外的维度,其形状为(3, 2, 1),而之前的(3, 2) 形状为df1.values

此外,df2.values[:, None] 向中心轴添加了一个额外的维度,使其形状从最初的(3,2) 变为(3, 1, 2),以帮助进行乘法过程。

最后,reshape 它们与原始 df1(或)df2 的行数相同
因为在提到的问题中两者具有相同的形状 em>)。

【讨论】:

  • 太棒了!我真的很喜欢))我需要一些时间来改变在 python 中处理数据的概念,因为 Python 对我来说是一种新的编程语言。谢谢!!!
  • 如果在这个阶段使用广播似乎势不可挡,我建议 this post 好好阅读以掌握这些概念。
【解决方案2】:

您可以使用 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

【讨论】:

  • 非常感谢!!作为 Java 开发人员,您的解决方案对我来说更有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2017-09-28
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多