python批量处理excel文件 ,根据某列值 分为多个excel文件

问题描述:

在一个文件中存在多个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文件中。

两种方案对比

两种方法各有优点,取决于你的具体需求和数据量大小:

  1. 逐个读取并追加到文件

    • 优点:适用于较大的数据集,因为它在处理数据时不需要将所有数据加载到内存中,而是逐个读取和处理文件,可以减少内存使用。
    • 缺点:由于需要多次打开和关闭文件,可能会造成一些文件操作的开销,因此在大量小文件的情况下,可能会较慢。
  2. 合并所有数据后再拆分保存

    • 优点:在数据量相对较小或文件数量不太多的情况下,这种方法更简单和直观,通常执行速度更快。
    • 缺点:如果数据集非常大,可能会占用大量内存,因为它会将所有数据加载到内存中。

要选择哪种方法,取决于你的具体情况。如果数据量很大且内存有限,或者你需要实时处理大量数据,那么第一种方法更高效。如果数据相对较小,且你希望代码更简单,那么第二种方法可能更合适。

无论哪种方法,都可以满足你的需求,只要根据具体情况选择适当的方法即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值