首页 > 解决方案 > Python pandas 将两个数据帧中的列相乘以获得每行(组)的数字

问题描述

我正在使用 Python,并希望从每个组的两个数据帧中获得一个计算出的数字(价格 * 比率) :

表格1: df1

团体 类别 价格_1 价格_2 价格_3 价格_4
一个 单身的 20.1 19.8 19.7 19.9
一个 25.1 26.8 24.7 24.9
b 27.1 27.8 27.7 26.9

表 2: df2

团体 类别 ratio_1 ratio_2 ratio_3 ratio_4
一个 单身的 1.0 0.8 0.7 0.5
一个 1.0 0.7 0.6 0.4
b 1.0 0.7 0.5 0.3

期望的输出: df

团体 类别 价值
一个 单身的 59.68
一个 68.64
b 68.48

例如,对于 Group = 'b' 和 Category = 'Multi',值 = 27.1 * 1.0 + 27.8 * 0.7 + 27.7 * 0.5 + 26.9 * 0.3 = 68.48

我怎么能得到那个?谢谢!

标签: pythonpandasdataframematrix-multiplication

解决方案


我们可以使用set_index+在and (列和索引)str.split上创建一个 MultiIndex,然后使用数学运算来计算 value 列:df1df2

# Create MultiIndex on df1 and df2
idx_cols = ['Group', 'Category']
df1 = df1.set_index(idx_cols)
df1.columns = df1.columns.str.rsplit('_', n=1, expand=True)
df2 = df2.set_index(idx_cols)
df2.columns = df2.columns.str.rsplit('_', n=1, expand=True)

# Compute DF3
df3 = df1['price'].mul(df2['ratio']).sum(axis=1).reset_index(name='value')

df3

  Group Category  value
0     a   Single  59.68
1     a    Multi  68.64
2     b    Multi  68.48

df1变成:

               price                  
                   1     2     3     4
Group Category                        
a     Single    20.1  19.8  19.7  19.9
      Multi     25.1  26.8  24.7  24.9
b     Multi     27.1  27.8  27.7  26.9

df2变为:

               ratio               
                   1    2    3    4
Group Category                     
a     Single     1.0  0.8  0.7  0.5
      Multi      1.0  0.7  0.6  0.4
b     Multi      1.0  0.7  0.5  0.3

pandas将正确对齐列和索引以执行适当的乘法。


如果且仅当 DataFrames 已经正确对齐时,可以使用其中一个 DataFrames 中的 Group 和 Category 列简单地执行操作,并使用to_numpy将两个数据帧相乘在一起而忽略列索引并np.sum计算总数:

df3 = df1[['Group', 'Category']].copy()
df3['value'] = np.sum(
    df1.filter(like='price_').to_numpy() * df2.filter(like='ratio_').to_numpy(),
    axis=1
)

df3

  Group Category  value
0     a   Single  59.68
1     a    Multi  68.64
2     b    Multi  68.48

这种方法速度更快,占用空间更少,但需要 DataFramesdf1并且df2已经正确对齐(因为它们在 OP 中),但在处理错误方面的鲁棒性比前者低得多。但是,如果条件已经满足,这是最佳的。


推荐阅读