如何将唯一行复制到Pandas DataFrame?及Excel销售数据分客户拆分
1. 复制唯一行到Pandas DataFrame的方法
这里分两种常见场景给你解决方案:
提取原DataFrame中的唯一行生成新DF
如果你的需求是从已有DataFrame里筛选出所有唯一的行(去重),直接用drop_duplicates()方法就可以搞定:# 基于所有列的唯一性去重,生成新的唯一行DataFrame unique_rows_df = original_df.drop_duplicates() # 如果只需要根据特定列判断唯一性(比如只看客户名称) unique_rows_df = original_df.drop_duplicates(subset=['客户名称'], keep='first') # keep参数可选'first'保留第一个出现的行,'last'保留最后一个,False则删除所有重复行将单独的唯一行(Series)复制到新DF
如果你已经有单独的一行数据(比如从其他地方获取的Series对象),想要把它复制到新的DataFrame里,可以这样做:# 假设single_row是你要复制的唯一行(Pandas Series类型) new_df = pd.DataFrame([single_row]) # 要是需要把这行复制多次(比如复制5次) new_df = pd.DataFrame([single_row] * 5, columns=single_row.index)
2. 完成Excel销售数据按客户拆分到独立工作簿的功能
看你已经搭好了基础框架,我来帮你补全代码并解释关键步骤:
首先,先把你的代码片段补全,实现完整的拆分逻辑:
import pandas as pd import xlrd from openpyxl import Workbook # 假设你已经提前定义了这些变量: # cols = ['客户名称', '商品名称', '数量', '金额'] # 你的数据列名 # cust_dict = {'客户A': pd.DataFrame(columns=cols), '客户B': pd.DataFrame(columns=cols)} # 存储客户的字典 # sales_wb = xlrd.open_workbook('销售数据.xls') # 已打开的Excel工作簿 # sheets = sales_wb.sheet_names() # 所有工作表名称 # 遍历每个工作表处理数据 for sheet in sheets: ws = sales_wb.sheet_by_name(sheet) item_code = ws.cell(4, 0).value # 获取第4行第1列的商品编码(注意xlrd索引从0开始) # 读取工作表数据,跳过前7行 df = pd.read_excel(sales_wb, engine='xlrd', sheet_name=sheet, skiprows=7) # 第一步:清理无效数据,删除全空的行和列 df = df.dropna(how='all').dropna(axis=1, how='all') # 检查是否存在客户名称列(拆分的核心依据) if '客户名称' not in df.columns: print(f"警告:工作表【{sheet}】未找到'客户名称'列,跳过该表处理") continue # 第二步:按客户拆分数据,追加到对应客户的DataFrame中 for cust_name in cust_dict.keys(): # 筛选当前客户的数据,一定要用copy()避免链式赋值警告 cust_specific_data = df[df['客户名称'] == cust_name].copy() # 如果商品编码有效,把它添加到数据里让明细更完整(可选操作,根据需求调整) if item_code: cust_specific_data['商品编码'] = item_code # 合并到客户的DataFrame中,重置索引避免重复 cust_dict[cust_name] = pd.concat([cust_dict[cust_name], cust_specific_data], ignore_index=True) # 第三步:将每个客户的数据导出到独立的Excel工作簿 for cust_name, cust_df in cust_dict.items(): # 跳过没有数据的客户,避免生成空文件 if cust_df.empty: print(f"客户【{cust_name}】无有效销售数据,跳过导出") continue # 生成导出文件名,用客户名称命名 output_filename = f"{cust_name}_销售明细.xlsx" # 使用openpyxl引擎写入xlsx格式文件(xlrd只支持读取xls) with pd.ExcelWriter(output_filename, engine='openpyxl') as writer: cust_df.to_excel(writer, sheet_name='销售明细', index=False) print(f"已成功导出客户【{cust_name}】的销售数据到文件:{output_filename}")
关键细节说明:
- 数据清理:
dropna(how='all')是为了去掉读取Excel时可能引入的空行空列,避免后续筛选出无效数据 - 商品编码追加:因为每个工作表对应一个商品编码,把它加到数据里能让每个明细行都关联对应的编码,让数据更完整
- 数据合并:用
pd.concat来合并不同工作表中同一个客户的数据,ignore_index=True重置索引,避免出现重复的索引值 - 导出注意事项:导出时用
openpyxl引擎,因为xlrd只支持读取xls格式,而openpyxl支持写入xlsx格式,兼容性更好 - 空数据判断:跳过没有数据的客户,避免生成空的Excel文件,减少无效操作
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

