如何在Pandas中实现两个DataFrame的特定乘法运算?
实现两个Pandas DataFrame的特定乘法运算
问题描述
现有两个Pandas DataFrame:
第一个DataFrame(df1):
| A | B | C | |
|---|---|---|---|
| A | 1 | 2 | 3 |
| B | 3 | 3 | 1 |
| C | 2 | 1 | 1 |
第二个DataFrame(df2):
| d | e | |
|---|---|---|
| d | 0.2 | 0.3 |
| e | 0.1 | 0.4 |
需要将两者进行特定乘法运算,生成**多层行索引(df1索引 + df2索引)和多层列索引(df1列名 + df2列名)**的结果,每个位置的值为df1[i,j] * df2[k,l](其中i是df1行索引,j是df1列名,k是df2行索引,l是df2列名)。
简便实现方法
可以利用Pandas的广播机制和多层索引构造快速实现,步骤如下:
- 初始化示例DataFrame:
import pandas as pd # 第一个DataFrame df1 = pd.DataFrame( [[1, 2, 3], [3, 3, 1], [2, 1, 1]], index=['A', 'B', 'C'], columns=['A', 'B', 'C'] ) # 第二个DataFrame df2 = pd.DataFrame( [[0.2, 0.3], [0.1, 0.4]], index=['d', 'e'], columns=['d', 'e'] )
- 执行运算并构造结果:
# 通过广播实现元素级乘法,得到三维数组 result_array = df1.values[:, :, None] * df2.values[None, None, :] # 构建多层行索引:df1索引与df2索引的笛卡尔积 row_multi_idx = pd.MultiIndex.from_product([df1.index, df2.index]) # 构建多层列索引:df1列名与df2列名的笛卡尔积 col_multi_idx = pd.MultiIndex.from_product([df1.columns, df2.columns]) # 将三维数组转换为多层索引DataFrame result_df = pd.DataFrame( result_array.reshape(-1, result_array.shape[1] * result_array.shape[2]), index=row_multi_idx, columns=col_multi_idx )
执行后得到的result_df完全符合需求,例如前几行结果如下:
A B C d e d e d e A d 0.2 0.3 0.4 0.6 0.6 0.9 e 0.1 0.4 0.2 0.8 0.3 1.2 B d 0.6 0.9 0.6 0.9 0.2 0.3 ...
另一种简洁写法
也可以用pd.concat结合apply实现,代码更紧凑:
result_df = pd.concat([df1.apply(lambda col: col[:, None] * df2) for col in df1.columns], axis=1)
内容的提问来源于stack exchange,提问作者Pavel Novoselov
相关产品推荐
相关产品推荐

