[英]Merging columns from two Pandas dataframes and showing the source for each row
[英]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.split
在df1
和df2
(列和索引)上创建一个 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
这种方法速度更快,占用的空间更少,但需要数据帧df1
和df2
已经正确对齐(就像它们在 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.