多个文件夹excel数据合并问题
import osimport pandas as pd
def merge_excel_files_from_folders(root_folder):
# 创建一个空的DataFrame来存储所有数据
all_data = pd.DataFrame()
# 遍历根文件夹中的所有子文件夹
for foldername, subfolders, filenames in os.walk(root_folder):
for filename in filenames:
# 检查文件是否为Excel文件
if filename.endswith('.xlsx') or filename.endswith('.xls'):
# 构建文件的完整路径
file_path = os.path.join(foldername, filename)
# 读取Excel文件
df = pd.read_excel(file_path)
# 将读取的数据追加到all_data中
all_data = pd.concat(, ignore_index=True)
return all_data
def save_merged_data_to_excel(data, output_file):
# 将合并后的数据保存到新的Excel文件中
data.to_excel(output_file, index=False)
if __name__ == "__main__":
# 根文件夹路径,包含所有子文件夹和Excel文件
root_folder = "E:/ai/shiyan"
# 输出文件路径
output_file = "E:/ai/shiyan/merged_data.xlsx"
# 合并数据
merged_data = merge_excel_files_from_folders(root_folder)
# 保存合并后的数据到Excel文件
save_merged_data_to_excel(merged_data, output_file)
print(f"数据已成功合并并保存到 {output_file}")
这个程序只是将文件夹下的表格合在一张表上,怎么能够使结构相同的表格数据相加在一起。 您可以调整代码,使其在合并各个Excel文件的数据时,以结构相同的表格数据进行相加。可以使用 groupby 和 sum 方法来实现这一点。以下是修改后的代码:
import os
import pandas as pd
def merge_excel_files_from_folders(root_folder):
# 创建一个空的DataFrame来存储所有数据
all_data = pd.DataFrame()
# 遍历根文件夹中的所有子文件夹
for foldername, subfolders, filenames in os.walk(root_folder):
for filename in filenames:
# 检查文件是否为Excel文件
if filename.endswith('.xlsx') or filename.endswith('.xls'):
# 构建文件的完整路径
file_path = os.path.join(foldername, filename)
# 读取Excel文件
df = pd.read_excel(file_path)
# 将读取的数据追加到all_data中
all_data = pd.concat(, ignore_index=True)
# 按相同结构的列进行分组并求和
merged_data = all_data.groupby(list(all_data.columns), as_index=False).sum()
return merged_data
def save_merged_data_to_excel(data, output_file):
# 将合并后的数据保存到新的Excel文件中
data.to_excel(output_file, index=False)
if __name__ == "__main__":
# 根文件夹路径,包含所有子文件夹和Excel文件
root_folder = "E:/ai/shiyan"
# 输出文件路径
output_file = "E:/ai/shiyan/merged_data.xlsx"
# 合并数据
merged_data = merge_excel_files_from_folders(root_folder)
# 保存合并后的数据到Excel文件
save_merged_data_to_excel(merged_data, output_file)
print(f"数据已成功合并并保存到 {output_file}")
以上代码通过 groupby 方法将相同结构的表格数据进行分组,并使用 sum 方法对这些分组数据进行求和。这样可以实现将多个Excel文件中的相同结构数据进行相加合并。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 表头有合并,行中有小标题,该怎么修改
wangpan10163 发表于 2025-02-17 19:25
表头有合并,行中有小标题,该怎么修改
对于表头存在合并单元格、行中有小标题的情况,可以先处理表头以将其标准化为扁平的单层结构(例如,通过合并多层表头为一层,或者删除无用的表头信息),然后,再处理数据中的小标题行,将其过滤或跳过。
下面是调整后的代码模板,假设您希望跳过带有小标题的行,并且将合并单元格的表头扁平化:
import os
import pandas as pd
def process_excel_file(file_path):
# 读取Excel文件,并指定header=None以逐行读取
df = pd.read_excel(file_path, header=None)
# 假定第一行为表头(处理合并单元格)
df.columns = df.iloc# 使用第一行作为列名
df = df# 删除第一行(已作为表头)
# 处理小标题行,例如,假设小标题行中某一列值为特定的标志
df = df[~df.iloc[:, 0].str.contains('小标题', na=False)]# 根据具体规则过滤掉小标题行
return df
def merge_excel_files_from_folders(root_folder):
all_data = pd.DataFrame()
for foldername, subfolders, filenames in os.walk(root_folder):
for filename in filenames:
if filename.endswith('.xlsx') or filename.endswith('.xls'):
file_path = os.path.join(foldername, filename)
# 处理单个文件并标准化数据
df = process_excel_file(file_path)
# 合并数据
all_data = pd.concat(, ignore_index=True)
return all_data
def save_merged_data_to_excel(data, output_file):
data.to_excel(output_file, index=False)
if __name__ == "__main__":
root_folder = "E:/ai/shiyan"
output_file = "E:/ai/shiyan/merged_data.xlsx"
merged_data = merge_excel_files_from_folders(root_folder)
save_merged_data_to_excel(merged_data, output_file)
print(f"数据已成功合并并保存到 {output_file}")
### 关键修改点:
1. **处理合并单元格的表头**:使用 header=None 读取表格的所有内容后,将第一行的数据设置为列名。
2. **移除小标题行**:通过条件判断(如 str.contains('小标题'))来过滤掉不需要的小标题行。
3. **确保数据一致性**:在处理过程中保证每个文件生成标准化的结构。
你需要根据具体的表格特点调整 process_excel_file 函数中的逻辑,比如表头的位置和小标题的判定规则。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 如果需要将第一列忽略,以小标题的其中1列作为表头呢
wangpan10163 发表于 2025-02-17 23:26
如果需要将第一列忽略,以小标题的其中1列作为表头呢
好的,如果需要忽略第一列,并将小标题的某一列作为表头,可以参考下面的代码进行调整。以下代码假设小标题行中某一列具有特定的标志,用于识别和设置表头:
import os
import pandas as pd
def process_excel_file(file_path):
# 读取Excel文件,并指定header=None以逐行读取
df = pd.read_excel(file_path, header=None)
# 忽略第一列
df = df.iloc[:, 1:]
# 找到小标题行,假设小标题具有特定标志(例如,该行的某一列包含特定值)
header_row_index = df.str.contains('小标题标志', na=False)].index
# 设定该行为新的表头,并重新读取数据
df.columns = df.iloc
df = df# 删除小标题行及其之前的行
# 重置索引
df.reset_index(drop=True, inplace=True)
return df
def merge_excel_files_from_folders(root_folder):
all_data = pd.DataFrame()
for foldername, subfolders, filenames in os.walk(root_folder):
for filename in filenames:
if filename.endswith('.xlsx') or filename.endswith('.xls'):
file_path = os.path.join(foldername, filename)
# 处理单个文件并标准化数据
df = process_excel_file(file_path)
# 合并数据
all_data = pd.concat(, ignore_index=True)
return all_data
def save_merged_data_to_excel(data, output_file):
data.to_excel(output_file, index=False)
if __name__ == "__main__":
root_folder = "E:/ai/shiyan"
output_file = "E:/ai/shiyan/merged_data.xlsx"
merged_data = merge_excel_files_from_folders(root_folder)
save_merged_data_to_excel(merged_data, output_file)
print(f"数据已成功合并并保存到 {output_file}")
### 关键修改点:
1. **忽略第一列**:使用 df = df.iloc[:, 1:] 来忽略第一列。
2. **找到并设置新的表头**:通过指定标志(如小标题标志)找到小标题行的索引,并将此行设为新的表头。
3. **删除小标题行及其之前的行**:根据计算出的索引范围删除这些行。
4. **重置索引**:使用 df.reset_index(drop=True, inplace=True) 重新设置DataFrame的索引。
请根据具体的小标题标志来调整识别条件和处理逻辑。这段代码将帮助您根据需求合并多个Excel文件的数据。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]