问题描述:
在一个文件中存在多个excel文件:
想法:
用 python 读取 H:\下载\统计年鉴\01指标\用后删 路径下所有的excel文件,根据 zone 列的值,将其保存到 cnki-区域代码-指标数据_{zone}.xlsx 的 文件中 ,同时统计 每个zone 的行数,保存到 cnki-区域代码-指标数据_统计.xlsx 文件中,该文件中包括 文件路径、zone、和zone的行数、每个zone中indicateName 列唯一值的个数
代码实现
方案一
使用Python中的pandas
库来处理Excel文件,并使用os
库来遍历文件夹中的文件和目录。
import os
import pandas as pd
# 定义文件夹路径
folder_path = r'H:\下载\统计年鉴\01指标\用后删'
# 创建一个空的字典来存储每个zone的行数和唯一值个数
zone_stats = {}
# 遍历文件夹中的每个Excel文件
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith('.xlsx'):
file_path = os.path.join(root, file)
# 读取Excel文件
df = pd.read_excel(file_path)
# 提取zone列的值
zone_values = df['zone'].unique()
# 统计每个zone的行数和唯一值个数
for zone in zone_values:
zone_df = df[df['zone'] == zone]
zone_stats[zone] = {
'row_count': len(zone_df),
'unique_indicate_count': len(zone_df['indicateName'].unique())
}
# 将数据保存到对应的文件
output_file = f'cnki-{zone}-指标数据_{zone}.xlsx'
zone_df.to_excel(output_file, index=False)
# 创建统计文件
stats_df = pd.DataFrame.from_dict(zone_stats, orient='index')
stats_df.reset_index(inplace=True)
stats_df.columns = ['zone', 'row_count', 'unique_indicate_count']
stats_output_file = 'cnki-区域代码-指标数据_统计.xlsx'
stats_df.to_excel(stats_output_file, index=False)
这段代码首先遍历指定文件夹中的所有Excel文件,然后按照zone的值将数据分割保存到不同的文件中,同时统计每个zone的行数和唯一值个数,并将统计结果保存到一个名为cnki-区域代码-指标数据_统计.xlsx
的文件中。请确保在运行代码之前,安装了pandas
库,你可以使用pip install pandas
来安装。
但是 zone可能分布在多个excel文件中
进一步优化代码
如果zone
的数据分布在多个Excel文件中,可以首先将所有Excel文件合并成一个数据帧,然后再根据zone
的值将数据拆分并保存到不同的文件中。
import os
import pandas as pd
# 定义文件夹路径
folder_path = r'H:\下载\统计年鉴\01指标\用后删'
# 创建一个空的DataFrame来存储所有数据
all_data = pd.DataFrame()
# 遍历文件夹中的每个Excel文件
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith('.xlsx'):
file_path = os.path.join(root, file)
# 读取Excel文件
df = pd.read_excel(file_path)
# 将数据合并到all_data中
all_data = pd.concat([all_data, df], ignore_index=True)
# 创建一个字典来存储每个zone的数据
zone_data = {}
# 遍历合并后的数据帧,按zone值拆分数据并保存
for zone, zone_df in all_data.groupby('zone'):
# 创建输出文件的名称
output_file = f'cnki-{zone}-指标数据_{zone}.xlsx'
# 将数据保存到对应的文件
zone_df.to_excel(output_file, index=False)
# 统计每个zone的行数和唯一值个数
zone_data[zone] = {
'row_count': len(zone_df),
'unique_indicate_count': len(zone_df['indicateName'].unique())
}
# 创建统计文件
stats_df = pd.DataFrame.from_dict(zone_data, orient='index')
stats_df.reset_index(inplace=True)
stats_df.columns = ['zone', 'row_count', 'unique_indicate_count']
stats_output_file = 'cnki-区域代码-指标数据_统计.xlsx'
stats_df.to_excel(stats_output_file, index=False)
这段代码首先将所有Excel文件中的数据合并到一个数据帧all_data
中,然后根据zone
的值将数据拆分并保存到不同的文件中,同时统计每个zone
的行数和唯一值个数,并将统计结果保存到cnki-区域代码-指标数据_统计.xlsx
文件中。
方案2
边逐个读取Excel文件,并将数据追加到已存在的文件中。
import os
import pandas as pd
# 定义文件夹路径
folder_path = r'H:\下载\统计年鉴\01指标\用后删'
# 创建一个字典来存储每个zone的数据帧
zone_dataframes = {}
# 遍历文件夹中的每个Excel文件
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith('.xlsx'):
file_path = os.path.join(root, file)
# 读取Excel文件
df = pd.read_excel(file_path)
# 提取zone列的值
zone_values = df['zone'].unique()
# 根据zone值将数据追加到相应的数据帧中
for zone in zone_values:
if zone not in zone_dataframes:
zone_dataframes[zone] = df[df['zone'] == zone]
else:
zone_dataframes[zone] = pd.concat([zone_dataframes[zone], df[df['zone'] == zone]])
# 遍历zone数据帧字典,将数据保存到对应的文件
for zone, zone_df in zone_dataframes.items():
# 创建输出文件的名称
output_file = f'cnki-{zone}-指标数据_{zone}.xlsx'
# 将数据保存到对应的文件,如果文件不存在则创建新文件
if not os.path.exists(output_file):
zone_df.to_excel(output_file, index=False)
else:
with pd.ExcelWriter(output_file, engine='openpyxl', mode='a') as writer:
zone_df.to_excel(writer, index=False, header=False)
# 创建统计文件
zone_stats = {}
for zone, zone_df in zone_dataframes.items():
zone_stats[zone] = {
'row_count': len(zone_df),
'unique_indicate_count': len(zone_df['indicateName'].unique())
}
stats_df = pd.DataFrame.from_dict(zone_stats, orient='index')
stats_df.reset_index(inplace=True)
stats_df.columns = ['zone', 'row_count', 'unique_indicate_count']
stats_output_file = 'cnki-区域代码-指标数据_统计.xlsx'
stats_df.to_excel(stats_output_file, index=False)
首先遍历文件夹中的每个Excel文件,然后根据zone
的值将数据追加到相应的数据帧中,并将每个zone
的数据帧保存到对应的文件中。同时,它还统计了每个zone
的行数和唯一值个数,并将统计结果保存到cnki-区域代码-指标数据_统计.xlsx
文件中。
两种方案对比
两种方法各有优点,取决于你的具体需求和数据量大小:
-
逐个读取并追加到文件:
- 优点:适用于较大的数据集,因为它在处理数据时不需要将所有数据加载到内存中,而是逐个读取和处理文件,可以减少内存使用。
- 缺点:由于需要多次打开和关闭文件,可能会造成一些文件操作的开销,因此在大量小文件的情况下,可能会较慢。
-
合并所有数据后再拆分保存:
- 优点:在数据量相对较小或文件数量不太多的情况下,这种方法更简单和直观,通常执行速度更快。
- 缺点:如果数据集非常大,可能会占用大量内存,因为它会将所有数据加载到内存中。
要选择哪种方法,取决于你的具体情况。如果数据量很大且内存有限,或者你需要实时处理大量数据,那么第一种方法更高效。如果数据相对较小,且你希望代码更简单,那么第二种方法可能更合适。
无论哪种方法,都可以满足你的需求,只要根据具体情况选择适当的方法即可。