Python:将一个数据帧与另一个数据帧相乘

Python: Multiplying a dataframe with another dataframe

嗨,我目前有 2 个不同形状的数据框

df11 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                   columns=['a', 'b', 'c'])
    a   b   c
0   1   2   3
1   4   5   6
2   7   8   9

df12 = pd.DataFrame(np.array([[7, 8, 9]]),
                   columns=['a', 'b', 'c'])

a   b   c
0   7   8   9

我想将 df11 中的每一行乘以 df12。所以生成的数据框应该显示

df13 = pd.DataFrame(np.array([[7, 16, 27], [28, 40, 54], [49, 64, 81]]),
                   columns=['a', 'b', 'c'])

    a   b   c
0   7   16  27
1   28  40  54
2   49  64  81

我推荐使用 numpy 乘法

df13 = pd.DataFrame(df11.to_numpy()*df12.to_numpy(), columns=df11.columns)

或者你可以像这样使用 pandas mul 运算符,

df11.mul({'a': 7, 'b': 8, 'c': 9})

One-liner

df_3 = df_1 * df_2.iloc[0]

代码

import pandas as pd

data_1 = {'a': [1, 4, 7],
          'b': [2, 5, 8],
          'c': [3, 6, 9]}
data_2 = {'a': [7], 'b': [8], 'c': [9]}
df_1 = pd.DataFrame(data_1)
df_2 = pd.DataFrame(data_2)

df_3 = df_1 * df_2.iloc[0]
print(df_3)

输出

    a   b   c
0   7  16  27
1  28  40  54
2  49  64  81

时间 此输入的一些时间。

# Paul_O's numpy approach
25.9 µs ± 440 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# iloc approach
172 µs ± 962 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# mozway's approach 
194 µs ± 254 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# Paul_O's mul approach
308 µs ± 1.38 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

使 data_1 10000 x 3 DataFrame 1 到 10000 之间的随机整数,我们得到非常相似的结果。

# Paul_O's numpy approach
39 µs ± 396 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# iloc approach
188 µs ± 1.94 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# mozway's approach
206 µs ± 2.86 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

# Paul_O's mul approach
312 µs ± 1.95 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

当然,这只是一个系统上两组非常具体的输入的两组时序,所以我不建议从中得出硬性结论,但看起来如果你的问题与这个问题非常相似,那么numpy 方法最好。在其他情况下,最佳方式可能会有所不同,例如,如果您的输入形式不同。

您可以使用 squeeze:

df13 = df11*df12.squeeze()

潜在的优势在于,如果 df12 有超过 2 行,它将执行二维乘法。

输出:

    a   b   c
0   7  16  27
1  28  40  54
2  49  64  81