基于两个Pandas DataFrame生成指定样式的透视表/表格结果
需求说明
现有两个Pandas DataFrame,定义如下:
df1 = pd.DataFrame({'Item':['a','b','c','a1','b1','c1','a2','b2','c2','a3','b3','c3'], 'b':[1,2,3,11,21,31,12,22,32,13,23,33]}) df2 = pd.DataFrame({'S':[200], 'M':[300],'L':[200], 'XL':[300],'2XL':[200], '3XL':[300]})
需要生成如下样式的表格:
| Item | Qty | S | M | L | XL | 2XL | 3XL | total |
|---|---|---|---|---|---|---|---|---|
| a | 200 | 200*1 | 300*1 | 200*1 | 300*1 | 200*1 | 300*1 | 1500 |
| b | 300 | 200*2 | ||||||
| c | 400 | 200*3 | ||||||
| a1 | 200 | |||||||
| b1 | 100 | |||||||
| c1 | 400 | |||||||
| a2 | 100 | |||||||
| b2 | 104 | |||||||
| c2 | 402 | |||||||
| a3 | 150 | |||||||
| b3 | 140 | |||||||
| c3 | 170 | |||||||
| total | ??? | ???? |
规则说明:
- 各尺码列(S、M、L、XL、2XL、3XL)的值为
df2对应尺码数值 × df1中对应Item的b列数值 - 表格需包含
Qty列、每行的total列、最后一行的总计行
实现代码
import pandas as pd # 定义原始DataFrame df1 = pd.DataFrame({'Item':['a','b','c','a1','b1','c1','a2','b2','c2','a3','b3','c3'], 'b':[1,2,3,11,21,31,12,22,32,13,23,33]}) df2 = pd.DataFrame({'S':[200], 'M':[300],'L':[200], 'XL':[300],'2XL':[200], '3XL':[300]}) # 构造示例中的Qty列数据 qty_data = [200, 300, 400, 200, 100, 400, 100, 104, 402, 150, 140, 170] df1['Qty'] = qty_data # 提取尺码对应的数值 size_values = df2.iloc[0].to_dict() # 生成各尺码列:计算df2数值与df1中b值的乘积 for size, val in size_values.items(): df1[size] = df1['b'] * val # 计算每行的total:所有尺码列的和 df1['total'] = df1[list(size_values.keys())].sum(axis=1) # 构造总计行 total_row = pd.DataFrame({ 'Item': ['total'], 'Qty': [df1['Qty'].sum()], **{size: [df1[size].sum()] for size in size_values.keys()}, 'total': [df1['total'].sum()] }) # 合并原数据和总计行,调整列顺序 result_df = pd.concat([df1, total_row], ignore_index=True) column_order = ['Item', 'Qty', 'S', 'M', 'L', 'XL', '2XL', '3XL', 'total'] result_df = result_df[column_order] # 若需要显示"200*1"这类表达式而非计算结果,取消以下注释 # for size, val in size_values.items(): # result_df[size] = result_df.apply(lambda x: f"{val}*{x['b']}" if x['Item'] != 'total' else x[size], axis=1) # 打印结果 print(result_df.to_string(index=False))
代码说明
- 先给
df1添加示例中的Qty列数据; - 提取
df2的尺码数值,遍历生成每个尺码列,值为尺码数乘df1的b列; - 计算每行
total为所有尺码列的和; - 构造总计行,计算各列总和并追加到表格末尾;
- 调整列顺序匹配示例格式;
- 如需显示乘积表达式而非计算结果,取消对应代码块的注释即可。
内容的提问来源于stack exchange,提问作者abdullah qureshi
相关产品推荐
相关产品推荐

