用python和pandas实现一个汇总报表程序,需求如下: 输入excel文件(1个或多个),包含sheet"FactoryCapacityPlan",这个sheet第2行是标题行,从D2开始是连续的年月,比如:"2024/01"、"2024/02"、"2024/03"等; 第3行开始每3行是一组,每一组第一行的A列是工厂代码:名称,比如:"0001:Goldfame Enterprises Limited"; 第一行的B列是生产类别,取值是一组枚举值,比如:"Z:All"、"2:bottoms"、"4:cut & sewn",其中"Z:All"表示所有的生产类别的合计; C列三行分别是"Max"、"Min"、"Booked";D列开始都是数值; 现在要求对每一个不同的工厂代码进行汇总,每个工厂生成3行数据,分别是"Max"、"Min"、"Booked",每行的列名是年月格式,比如:"2024/01"、"2024/02"、"2024/03"等; 每行的值对应的输入文件中的数值:若工厂的"Z:All"行对应列有数值,则取该数值,否则对该工厂下所有的生产类别的相应"Max"、"Min"、"Booked"的值求和; 最后输出dataframe,第一列是工厂代码,第二列分别是"Max"、"Min"、"Booked",第三列开始是每个年月的数值;
时间: 2025-04-24 20:26:53 浏览: 38
<think>好的,我现在需要帮助用户解决使用Python和Pandas处理Excel文件生成汇总报表的问题。首先,用户的问题是关于如何读取特定工作表,并按照多个字段进行数据汇总,包括对年月列的数值计算。我需要回顾之前提供的引用内容,确保解决方案符合用户的需求。
首先,用户提到要读取包含'FactoryCapacityPlan'工作表的Excel文件。根据引用[1]和引用[2],用户已经知道如何使用pandas的read_excel函数,但需要指定工作表名称。所以在代码中需要使用sheet_name参数来指定工作表。例如,df = pd.read_excel(file_path, sheet_name='FactoryCapacityPlan')。
接下来是数据汇总的要求。用户需要按照工厂代码、生产类别(如Z:All)、Max/Min/Booked等字段进行汇总。这里可能需要使用groupby方法,然后对年月列进行聚合计算。例如,使用groupby(['工厂代码', '生产类别', '字段类型'])对数据进行分组,然后对数值列进行求和或平均值等操作。
不过用户提到需要对年月列进行数值计算,这可能是指这些列代表不同月份的数据,需要汇总每个月的数值。例如,如果数据中有类似'2023-01', '2023-02'这样的列,可能需要将这些列的值相加或取最大值等。这时候,可能需要将这些年月列识别为数值列,并在groupby后进行聚合计算。
此外,用户可能需要处理字段类型(Max/Min/Booked),可能需要分别汇总这些不同类型的数值。例如,对于每个工厂和生产类别,计算Max值的总和,Min的平均值,或者Booked的总和。这可能需要使用agg函数,指定不同字段类型的聚合方式。
还需要注意数据清洗,比如检查是否有缺失值,或者数据类型是否正确。例如,年月列可能需要转换为数值类型,或者确保它们是数字格式,以便进行汇总计算。
然后,生成最终的数据框格式结果,可能需要将汇总后的数据重新组织,确保每个工厂代码、生产类别、字段类型组合对应正确的汇总值,年月列按需求处理。
现在,综合这些步骤,我需要编写代码示例,逐步展示如何读取Excel,处理数据,进行分组汇总,并输出结果。同时,要确保代码符合用户提供的引用中的方法,比如使用正确的参数和函数。
可能的问题点包括正确识别年月列,处理多个分组字段,以及应用正确的聚合函数。需要测试代码是否能够正确执行,并生成所需的报表结构。
最后,用户可能需要进一步的问题,比如如何处理不同的聚合方式,或者如何处理大型Excel文件,但根据当前问题,应专注于读取、分组和汇总的基本步骤。</think>根据您的需求,我们将分步骤实现Excel数据处理和汇总报表生成:
### 一、读取Excel文件
```python
import pandas as pd
# 读取指定工作表
file_path = "your_file.xlsx"
df = pd.read_excel(
file_path,
sheet_name='FactoryCapacityPlan', # 指定工作表
engine='openpyxl' # 确保能读取.xlsx格式
)
```
### 二、数据预处理
```python
# 筛选目标字段
target_columns = ['工厂代码', '生产类别', '字段类型'] + [col for col in df.columns if col.isdigit()] # 假设年月列为数字格式
filtered_df = df[target_columns].copy()
# 转换生产类别为统一格式
filtered_df['生产类别'] = filtered_df['生产类别'].apply(lambda x: 'Z:All' if 'Z:All' in str(x) else x)
```
### 三、数据汇总
```python
# 定义聚合函数
agg_funcs = {
**{col: 'sum' for col in filtered_df.columns if col.isdigit()}, # 对数字列求和
'字段类型': lambda x: x.mode()[0] # 取Max/Min/Booked的众数
}
# 分组聚合
summary_df = filtered_df.groupby(
['工厂代码', '生产类别'],
as_index=False
).agg(agg_funcs)
```
### 四、结果输出
```python
# 列重命名规范
summary_df.columns = [f"汇总_{col}" if col.isdigit() else col for col in summary_df.columns]
# 生成最终报表
print(summary_df.to_markdown(index=False))
```
阅读全文