鱼C论坛

 找回密码
 立即注册
查看: 1923|回复: 11

新人求助,筛选出来的表没有标题?

[复制链接]
发表于 2023-6-2 17:08:38 | 显示全部楼层 |阅读模式
60鱼币
import os
import pandas as pd

# 原始表格文件夹路径
input_folder = r'G:\2023\777'

# 保存新表格的文件夹路径
output_folder = r'G:\2023\555'

# 获取原始表格文件列表
input_files = os.listdir(input_folder)

for file in input_files:
    if file.endswith('.xls'):
        # 构建原始表格文件的完整路径
        file_path = os.path.join(input_folder, file)
        
        # 读取原始表格数据,跳过第一行
        df = pd.read_excel(file_path, skiprows=1)
        
        # 筛选出xx社区
        filtered_df = df[df.iloc[:, 6] == 'xx社区']
        
        # 重新排列序号列
        filtered_df.loc[:, '序号'] = range(1, len(filtered_df) + 1)
        
        # 保留指定列
        columns_to_keep = ['序号', '户主姓名', 'xx社区','金额合计']
        filtered_df = filtered_df[columns_to_keep]
        
        # 创建新表格的文件名
        output_file = os.path.join(output_folder, os.path.splitext(file)[0] + '.xlsx')
        
        # 保存新表格,跳过第一行
        filtered_df.to_excel(output_file, index=False, startrow=1)
上面代码是将文件夹里一堆表,按社区名字进行筛选后,生成新的表,但是生成出来的,没有标题,但是我又想保留原表标题,我该怎么搞?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 17:13:34 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-6-2 17:15 编辑

你可以在读取原始表格数据时,保留第一行作为标题行,而不是跳过第一行,例如使用header=0参数表示将第一行作为标题行,然后在保存新表格时,在原来的基础上加上标题行即可。修改后的代码如下所示:
import os
import pandas as pd

# 原始表格文件夹路径
input_folder = r'G:\2023\777'

# 保存新表格的文件夹路径
output_folder = r'G:\2023\555'

# 获取原始表格文件列表
input_files = os.listdir(input_folder)

for file in input_files:
    if file.endswith('.xls'):
        # 构建原始表格文件的完整路径
        file_path = os.path.join(input_folder, file)
        
        # 读取原始表格数据,保留第一行作为标题行
        df = pd.read_excel(file_path, header=0)
        
        # 筛选出xx社区
        filtered_df = df[df.iloc[:, 6] == 'xx社区']
        
        # 重新排列序号列
        filtered_df.loc[:, '序号'] = range(1, len(filtered_df) + 1)
        
        # 保留指定列
        columns_to_keep = ['序号', '户主姓名', 'xx社区','金额合计']
        filtered_df = filtered_df[columns_to_keep]
        
        # 创建新表格的文件名
        output_file = os.path.join(output_folder, os.path.splitext(file)[0] + '.xlsx')
        
        # 保存新表格,加上标题行
        with pd.ExcelWriter(output_file) as writer:
            df.to_excel(writer, sheet_name='Sheet1', index=False)
            filtered_df.to_excel(writer, sheet_name='Sheet1', index=False, startrow=1)
这样就可以保留原表标题,并生成新表格了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-2 17:47:17 | 显示全部楼层
歌者文明清理员 发表于 2023-6-2 17:13
你可以在读取原始表格数据时,保留第一行作为标题行,而不是跳过第一行,例如使用header=0参数表示将第一行 ...

报错,这样也试过,将第一行保留,会因为筛选出来的数据找不到对应的列保存,KeyError: " ['序号', '户主姓名', 'xx社区','金额合计'] not in index"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 17:51:21 | 显示全部楼层
kyimao 发表于 2023-6-2 17:47
报错,这样也试过,将第一行保留,会因为筛选出来的数据找不到对应的列保存,KeyError: " ['序号', '户主 ...

根据错误提示,筛选出来的数据找不到对应的列保存,这是因为原始表格中可能存在其他列,而在筛选后的数据中并不存在这些列名,导致保存时出现了 KeyError 错误。你可以在筛选前,先将原始表格的列名保存下来,然后将该列表作为保留指定列的参数,这样就不会漏掉其他列了。修改后的代码如下所示:
import os
import pandas as pd

# 原始表格文件夹路径
input_folder = r'G:\2023\777'

# 保存新表格的文件夹路径
output_folder = r'G:\2023\555'

# 获取原始表格文件列表
input_files = os.listdir(input_folder)

for file in input_files:
    if file.endswith('.xls'):
        # 构建原始表格文件的完整路径
        file_path = os.path.join(input_folder, file)
        
        # 读取原始表格数据,保留第一行作为标题行
        df = pd.read_excel(file_path, header=0)
        
        # 保存原始表格的列名
        columns_to_keep = df.columns.tolist()
        
        # 筛选出xx社区
        filtered_df = df[df.iloc[:, 6] == 'xx社区']
        
        # 重新排列序号列
        filtered_df.loc[:, '序号'] = range(1, len(filtered_df) + 1)
        
        # 保留原始表格的列名
        filtered_df = filtered_df[columns_to_keep]
        
        # 保留指定列
        columns_to_keep = ['序号', '户主姓名', 'xx社区','金额合计']
        filtered_df = filtered_df[columns_to_keep]
        
        # 创建新表格的文件名
        output_file = os.path.join(output_folder, os.path.splitext(file)[0] + '.xlsx')
        
        # 保存新表格,加上标题行
        with pd.ExcelWriter(output_file) as writer:
            df.to_excel(writer, sheet_name='Sheet1', index=False)
            filtered_df.to_excel(writer, sheet_name='Sheet1', index=False, startrow=1)
这样就可以同时保留原表标题,并成功生成新表格了。
(我是他小号,但是他每小时限额到了,我帮忙)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 17:53:32 | 显示全部楼层
可以在读取原表数据时,将第一行作为表头(header)保存下来,然后在生成新表格时添加回去。

修改代码如下:
import os
import pandas as pd

# 原始表格文件夹路径
input_folder = r'G:\2023\777'

# 保存新表格的文件夹路径
output_folder = r'G:\2023\555'

# 获取原始表格文件列表
input_files = os.listdir(input_folder)

for file in input_files:
    if file.endswith('.xls'):
        # 构建原始表格文件的完整路径
        file_path = os.path.join(input_folder, file)
        
        # 读取原始表格数据,跳过第一行,并将第一行作为表头(header)保存下来
        df = pd.read_excel(file_path, skiprows=1, header=0)
        header = pd.read_excel(file_path, nrows=0).columns.tolist()
        
        # 筛选出xx社区
        filtered_df = df[df.iloc[:, 6] == 'xx社区']
        
        # 重新排列序号列
        filtered_df.loc[:, '序号'] = range(1, len(filtered_df) + 1)
        
        # 保留指定列
        columns_to_keep = ['序号', '户主姓名', 'xx社区','金额合计']
        filtered_df = filtered_df[columns_to_keep]
        
        # 创建新表格的文件名
        output_file = os.path.join(output_folder, os.path.splitext(file)[0] + '.xlsx')
        
        # 保存新表格,添加表头(header)到新表格首行
        with pd.ExcelWriter(output_file) as writer:
            filtered_df.to_excel(writer, sheet_name='Sheet1', index=False, startrow=1)
            workbook = writer.book
            worksheet = writer.sheets['Sheet1']
            for idx, val in enumerate(header):
                worksheet.write(0, idx, val)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 17:56:50 | 显示全部楼层
sfqxx 发表于 2023-6-2 17:53
可以在读取原表数据时,将第一行作为表头(header)保存下来,然后在生成新表格时添加回去。

修改代码如下 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 18:06:34 | 显示全部楼层
在这种情况下,您希望在筛选数据后,保留原表的标题。这可以通过在读取原始表格时,不跳过标题行来实现。然后在保存新表格时,不需要再跳过第一行。具体修改如下:
import os
import pandas as pd

# 原始表格文件夹路径
input_folder = r'G:\2023\777'

# 保存新表格的文件夹路径
output_folder = r'G:\2023\555'

# 获取原始表格文件列表
input_files = os.listdir(input_folder)

for file in input_files:
    if file.endswith('.xls'):
        # 构建原始表格文件的完整路径
        file_path = os.path.join(input_folder, file)
        
        # 读取原始表格数据,不跳过第一行
        df = pd.read_excel(file_path)
        
        # 筛选出xx社区
        filtered_df = df[df.iloc[:, 6] == 'xx社区']
        
        # 重新排列序号列
        filtered_df.loc[:, '序号'] = range(1, len(filtered_df) + 1)
        
        # 保留指定列
        columns_to_keep = ['序号', '户主姓名', 'xx社区','金额合计']
        filtered_df = filtered_df[columns_to_keep]
        
        # 创建新表格的文件名
        output_file = os.path.join(output_folder, os.path.splitext(file)[0] + '.xlsx')
        
        # 保存新表格,不跳过第一行
        filtered_df.to_excel(output_file, index=False)

这样修改后,新的表格就会有原始表格的标题了。注意,这种方法假定原始表格的标题位于第一行,并且列名为'序号', '户主姓名', 'xx社区', '金额合计'。如有不同,请进行相应调整。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 18:39:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-2 18:50:42 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-4 16:11:02 | 显示全部楼层
isdkz 发表于 2023-6-2 18:06
在这种情况下,您希望在筛选数据后,保留原表的标题。这可以通过在读取原始表格时,不跳过标题行来实现。然 ...

不行,原始表中有多个列,但是我只需要,这几个列,按你的代码,输出时就会提示找不到对应列名
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-4 16:40:53 | 显示全部楼层
sfqxx 发表于 2023-6-2 17:53
可以在读取原表数据时,将第一行作为表头(header)保存下来,然后在生成新表格时添加回去。

修改代码如下 ...

一样提示找不到xx社区,这列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-4 17:48:57 | 显示全部楼层
kyimao 发表于 2023-6-4 16:40
一样提示找不到xx社区,这列

根据代码,应该是将数据中第七列 "xx社区" 作为筛选条件,但出现了找不到该列的情况。可能有以下几种原因:

1. 数据表格中不存在名为“xx社区”的列。
2. 数据表格中“xx社区”这列存在,但列名与代码中写的不一致。
3. 数据表格中存在“xx社区”这列,但其实际内容并非所有行均为“xx社区”,导致筛选结果为空。

建议检查一下数据表格,看一下列名是否正确、实际内容是否如代码预期。另外,也可以通过打印出读取的原始数据看一下是否正确读入表格数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 10:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表