繁体   English   中英

Python pandas 将两个数据帧中的列相乘以获得每行(组)的数字

[英]Python pandas multiply columns from two dataframes to get a number for each row (group)

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

表 1: df1

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

表 2: df2

团体 类别 比率_1 比率_2 比率_3 比率_4
一种 单身的 1.0 0.8 0.7 0.5
一种 1.0 0.7 0.6 0.4
1.0 0.7 0.5 0.3

期望输出: df

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

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

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

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

# 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将正确对齐列和索引以执行适当的乘法。


如果且仅当 DataFrame 已经正确对齐时,可以简单地使用to_numpy之一中的 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

这种方法速度更快,占用的空间更少,但需要数据帧df1df2已经正确对齐(就像它们在 OP 中一样),但在处理错误方面不如前者健壮。 但是,如果满足条件,这是最佳的。

代码:

df = pd.DataFrame.from_dict({'Group': list(df1['Group']), 'Category': list(df1['Category']), 'value': df1['price_1']*df2['ratio_1'] + df1['price_2']*df2['ratio_2'] + df1['price_3']*df2['ratio_3'] + df1['price_4']*df2['ratio_4']})

输出:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM