python - 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
我怎么能得到那个?谢谢!
解决方案
我们可以使用set_index
+在and (列和索引)str.split
上创建一个 MultiIndex,然后使用数学运算来计算 value 列:df1
df2
# 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 中),但在处理错误方面的鲁棒性比前者低得多。但是,如果条件已经满足,这是最佳的。
推荐阅读
- daml - 如何提取党的名称?
- javascript - 隐藏带有文本内容的 tr(表格行)
- c++11 - 余数()在 if 语句 C++ 中不起作用
- python - 有没有办法让文件夹中的所有工作表,包括所有子文件夹?(在智能表中)
- jquery - 单击时识别重复的行值
- here-api - 地址或邮政编码的时区 - Here API
- angular - 如何在自定义组件的角度测试期间指定 ngModel 和 name 属性
- vb.net - 在具有唯一条件的数据表中查找第一行
- excel - 将具有定义名称的列剪切并粘贴到新工作表的最佳方法是什么,为什么我的代码不起作用?
- python - 如何获取子类的文件名?