Python:将子DataFrame按客户求和后合并至主DataFrame
解决DataFrame匹配唯一值并求和填充的通用方案
问题背景
需要将主客户列表DataFrame(df)的WK1列,填充为对应客户在DF_WK1中price列的求和值——即匹配两个DataFrame的Customer列,计算每个客户的price总和后填入主表的WK1列。核心需求是通用方案,要适配每周客户数据列(比如后续的WK2、WK3等)的变化,避免硬编码。
主表df结构:
| Customer | WK1 |
|---|---|
| a | sum |
| b | sum |
| c | sum |
| d | sum |
| e | sum |
| f | sum |
| g | sum |
| h | sum |
| i | sum |
| j | sum |
周数据DF_WK1结构:
| Customer | price |
|---|---|
| a | 22 |
| b | 37 |
| c | 2 |
| a | 44 |
| e | 29 |
| c | 64 |
| i | 22 |
| j | 37 |
| h | 2 |
| a | 44 |
| e | 29 |
| c | 64 |
当前代码的问题
你提供的代码存在几个关键错误:
- 错误覆盖主表
df:将主表替换为仅含唯一客户名的新DataFrame,丢失了原有的WK1列结构 groupby参数错误:使用df.CustomerName作为分组键,但原DF_WK1的客户列是Customer,且此时df已被错误替换- 未保留主表所有客户:缺少对无交易数据客户(如d、f、g)的处理逻辑
通用解决方案
基础版本(处理单周数据)
先对周数据按客户分组求和,再通过左连接合并到主表,确保主表所有客户都被保留:
import pandas as pd # 读取主客户列表(保留原有结构,不要覆盖) df = pd.read_excel("master_customer_list.xlsx") # 读取周数据 df_wk1 = pd.read_excel("test.xlsx") # 1. 对周数据按Customer分组求和,重命名列匹配主表的WK1 wk1_sum = df_wk1.groupby("Customer")["price"].sum().reset_index().rename(columns={"price": "WK1"}) # 2. 左连接主表与求和结果,无数据的客户填充0(可根据需求改为NaN) df = df.merge(wk1_sum, on="Customer", how="left").fillna({"WK1": 0}) print(df)
执行后df的WK1列会被正确填充,比如客户a的总和是22+44+44=110,客户d的WK1值为0。
扩展版本(适配多周数据变化)
如果需要处理WK2、WK3等多周数据,可封装成函数批量处理,完全不用修改核心逻辑:
import pandas as pd # 读取主客户表 df = pd.read_excel("master_customer_list.xlsx") # 定义通用处理函数:输入周数据路径、目标列名,返回合并后的主表 def process_week_data(week_file_path, target_col): week_df = pd.read_excel(week_file_path) # 分组求和并改名 week_sum = week_df.groupby("Customer")["price"].sum().reset_index().rename(columns={"price": target_col}) # 左连接合并,无数据填充0 return df.merge(week_sum, on="Customer", how="left").fillna({target_col: 0}) # 维护周数据文件映射:键是主表要填充的列名,值是对应Excel文件路径 week_data_map = { "WK1": "test.xlsx", "WK2": "week2_data.xlsx", "WK3": "week3_data.xlsx" } # 循环处理所有周数据 for col_name, file_path in week_data_map.items(): df = process_week_data(file_path, col_name) # 输出最终结果 print(df)
后续新增周数据时,只需要在week_data_map中添加新的键值对即可,完全适配业务变化。
内容的提问来源于stack exchange,提问作者logman117
相关产品推荐
相关产品推荐

