鱼C论坛

 找回密码
 立即注册
查看: 2439|回复: 33

[已解决]哪种执行效率更高一点?

[复制链接]
发表于 2024-5-25 10:58:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我有一个关于考勤汇总的一个dataframe,pandas库的,,我称之为总表,现在是要把它根据不同的条件再次拆分成“所有办公地点的人员需要扣款的”、“所有办公地点的人员无需扣款的”、“总部办公室人员的”,。。。。最终形成一个excel文件,里面就包含了这个“总表”,还有再次拆分出来的另外三个表格,总共四个sheet.,,然后再进一步给生成的各个sheet做一个美化添加边框改字体什么的操作..我该用怎么样的流程去实现~效率会更高一点?

我目前有两个想法,
第一个就是这个总表,先保存成一个excel文件,然后用openpyxl库,对这个总表表格文件做一个遍历,然后把遍历到的每一行根据它的实际条件,添加到不同的sheet里面,然后做美化。
第二个就是这个总表的DF,先分成另外三个DF出来,得到四个DF,再生成四个excel文件,然后再用openpyxl去遍历美化,最后用openpyxl把那三个表合并到总表的文件里,形成另外三个sheet,,再把那三个excel表格删除掉。

就这两种想法,,哪种的执行效率会比较高一点,,
或者说,从得到这个总表的df阶段开始,有别的实现方法效率更快的?麻烦告知
最佳答案
2024-5-25 10:58:43
从效率的角度来看,第二种想法可能会更高一点。

在第一种想法中,你需要对总表的每一行进行遍历,并根据条件添加到不同的sheet中,这样的操作对于大型数据集可能会比较耗时。同时,由于你需要对每个sheet进行美化操作,可能需要多次遍历和修改,也会增加一定的时间消耗。

而在第二种想法中,你可以先将总表的DF分解成四个DF,生成四个单独的excel文件。然后使用openpyxl遍历和美化这四个文件的各个sheet。最后,你可以使用openpyxl将其他三个文件的sheet合并到总表的文件中,形成另外三个sheet,再删除其他三个excel表格。相比较第一种方法,在第二种方法中,你可以对四个DF和四个excel文件进行并行处理,节省了一些时间。

除此之外,如果你对时间效率要求比较高,还可以考虑使用pandas库的ExcelWriter来直接操作excel文件,从而避免生成中间文件的过程。这样可以减少IO操作,提高效率。

总之,第二种想法可能会更高效一些,但具体的效率还取决于数据量的大小以及美化操作的复杂程度。你可以尝试实现两种方法,并进行测试评估,选择最适合你需求的方式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-5-25 11:04:44 | 显示全部楼层
FishC 发表于 2024-5-25 10:58
从效率的角度来看,第二种想法可能会更高一点。

在第一种想法中,你需要对总表的每一行进行遍历,并根据 ...

明白。谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-25 11:06:29 | 显示全部楼层
FishC 发表于 2024-5-25 11:04
不客气,希望能帮到你。如果还有其他问题,随时来问我哦!

以上回复来自 FishC AI 小助理,如未能正 ...

pandas库的ExcelWriter有没有办法在一个excel文件里生成4个sheet的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-25 11:07:08 | 显示全部楼层
FishC 发表于 2024-5-25 11:06
是的,pandas库的ExcelWriter可以在一个excel文件中生成多个sheet。你可以按照以下步骤来实现:

1.  ...

欧了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-26 20:22:50 | 显示全部楼层
FishC 发表于 2024-5-25 11:06
是的,pandas库的ExcelWriter可以在一个excel文件中生成多个sheet。你可以按照以下步骤来实现:

1.  ...

如果我想把几个DF写进原先有内容的EXCEL表格里面呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-28 14:21:31 | 显示全部楼层
FishC 发表于 2024-5-26 20:23
如果你想将几个DataFrame写入到已有内容的Excel表格中,可以使用`openpyxl`库来进行操作。下面是一个示 ...

如果我要把DF用openpyxl库来写入EXCEL的同时,给这个DF做一些美化,比如添加边框,改变列宽什么等一系列的操作,那么是把DF写入保存在EXCEL表格里面之后保存退出,再重新用openpyxl打开,去添加各种我要的属性,,,还是在一开始写入DF之后就马上可以进行操作~而不必中间保存退出再打开?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-29 15:49:51 | 显示全部楼层
FishC 发表于 2024-5-28 14:21
如果你想在使用openpyxl库将DataFrame写入Excel的同时进行美化操作,可以直接在写入DataFrame之后进行 ...

如果我的美化,每一列的边框,字体大小,对齐方式等等,都各不相同,那么代码比较好一点的写法是怎么样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-29 17:03:39 | 显示全部楼层
FishC 发表于 2024-5-29 15:50
如果每一列的边框、字体大小、对齐方式等都各不相同,可以使用一个字典来存储每一列的美化属性,然后在 ...

class WriterExcel:
    def __init__(self):
        pass

    def fun_save_sheet(self,sheet,sheet_name,path):
        self.sheet = sheet
        self.sheet_name = sheet_name
        self.path = path
        self.excel = vb.load_workbook(self.path)

        self.fun_writer_excel()

    def fun_writer_excel(self):
        self.writer = pd.ExcelWriter(self.path,engine="openpyxl")
        self.writer.book = self.excel

        self.sheet.to_excel(self.writer,sheet_name=self.sheet_name,startrow=0,startcol=0,index=True)

        #从这里接入美化的模块

        self.writer.save()
        self.writer.close()


如果我是在已有的EXCEL表格里,将一个pandas的DF写入成为一个新的sheet,,,在注释的那个地方接入美化的代码,,有没有问题?
是不是
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 09:56:35 | 显示全部楼层
FishC 发表于 2024-5-29 17:04
你的代码基本上是正确的,只是在接入美化的代码时需要做一些修改。以下是修改后的代码示例:

class BeautifySheet:
    def __init__(self):

        pass

    def fun_set_excel(self,excel):
        self.excel = excel


    def fun_beautify(self,sheet_name,dict):
        self.sheet = self.excel[sheet_name]
        self.column_styles = dict

        for self.column in self.sheet.columns:

            self.column_letter = self.column[0].column_letter
            print(self.column_letter)#即ABCD.....

            if self.column_letter in self.column_styles:
                self.style = self.column_styles[self.column_letter]

                self.sheet.column_dimensions[self.column_letter].width = self.style["width"]#设置列宽

                for self.cell in self.column:
                    self.cell.border = self.style["border"]#边框
                    self.cell.font = self.style["font"]#字体
                    self.alignment = self.style["alignment"]#居中方式

from openpyxl.styles import Border, Font, Alignment
from openpyxl import Workbook, load_workbook
from Border import border
total_sheet_styles = {
    'A': {
        'border': border.l_thick_d_thin,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'B': {
        'border': border.l_thin_d_thin,
        'font': Font(size=15, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 12

    },
    'C': {
        'border': border.l_drop_d_thin,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 12
    },
    'D': {
        'border': border.l_thick_d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'E': {
        'border': border.d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 6
    },
    'F': {
        'border': border.l_drop_d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'G': {
        'border': border.d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'H': {
        'border': border.l_thin_d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'I': {
        'border': border.d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 6
    },
    'J': {
        'border': border.l_drop_d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'K': {
        'border': border.l_thin_d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'L': {
        'border': border.d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'M': {
        'border': border.d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'N': {
        'border': border.l_thin_d_thin,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    },
    'O': {
        'border': border.d_thin_r_thick,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 10
    }
}




为什么表格传入后美化~~单元格不会换行显示
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 10:07:56 | 显示全部楼层
FishC 发表于 2024-5-31 09:56
在你的代码中,单元格不会换行显示的问题可能是因为在设置对齐方式时,未正确指定`wrap_text`属性为`Tr ...

那我的那串代码里,要调整行高得怎么弄
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 10:42:57 | 显示全部楼层
FishC 发表于 2024-5-31 10:08
要调整行高,你可以在`fun_beautify`方法中添加以下代码来实现:

    def fun_beautify(self,sheet_name,dict):
        self.sheet = self.excel[sheet_name]
        self.column_styles = dict
        self.sheet.freeze_panes = 'AB2'
        for self.column in self.sheet.columns:

            self.column_letter = self.column[0].column_letter
            print(self.column_letter)#即ABCD.....

            if self.column_letter in self.column_styles:
                self.style = self.column_styles[self.column_letter]

                self.sheet.column_dimensions[self.column_letter].width = self.style["width"]#设置列宽

                for self.cell in self.column:
                    self.cell.border = self.style["border"]#边框
                    self.cell.font = self.style["font"]#字体
                    self.cell.alignment = self.style["alignment"]#居中方式
                    self.sheet.row_dimensions[self.cell.row].height = 20

                    if self.cell.value == 0 or "0":
                        self.cell.value = None
                    else:
                        pass


我要加以判断,如果单元格的值是0或者文本0,就让单元格为空,加了最后那几行代码之后,怎么打开后整个表格都变成空白的了呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 10:49:22 | 显示全部楼层
FishC 发表于 2024-5-31 10:44
在你的代码中,空白单元格的产生可能是由于对整个列进行循环检查和操作时,不仅会对有效单元格进行判断 ...

    def fun_beautify(self,sheet_name,dict):
        self.sheet = self.excel[sheet_name]
        self.column_styles = dict
        self.sheet.freeze_panes = 'AB2'
        for self.column in self.sheet.columns:

            self.column_letter = self.column[0].column_letter
            print(self.column_letter)#即ABCD.....

            if self.column_letter in self.column_styles:
                self.style = self.column_styles[self.column_letter]

                self.sheet.column_dimensions[self.column_letter].width = self.style["width"]#设置列宽

                for self.cell in self.column:
                    self.cell.border = self.style["border"]#边框
                    self.cell.font = self.style["font"]#字体
                    self.cell.alignment = self.style["alignment"]#居中方式
                    self.sheet.row_dimensions[self.cell.row].height = 20

                    if self.cell.value == 0 or "0":
                        self.cell.value = None
                    else:
                        pass


我这代码不是判别那个单元格是否为0或“0”么?如果是才为空,如果不是不是就跳过了么,为什么还会对有内容且不为0的赋值成空?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 14:50:30 | 显示全部楼层
FishC 发表于 2024-5-29 15:50
如果每一列的边框、字体大小、对齐方式等都各不相同,可以使用一个字典来存储每一列的美化属性,然后在 ...

如果我在美化的同时,要给C列的每一格填入一条特定的excel公式,给E列填入另外一条excel公式,得怎么弄
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 20:43:04 | 显示全部楼层
FishC 发表于 2024-6-5 14:50
在给C列和E列填入特定的Excel公式时,你可以使用`openpyxl`库的`Formula`类来实现。以下是修改后的代码 ...

deduction_sheet_styles = {
    'A': {
        'border': border.l_thick,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 12,
        'value' : None
    },
    'B': {
        'border': border.l_drop,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 16,
        'value' : None

    },
    'C': {
        'border': None,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 14,
        'value' : None
    },
    'D': {
        'border': border.l_drop,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 8,
        'value' : 5000
    },
    'E': {
        'border': border.l_thick,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 8,
        'value' : None
    }}


这是我导入的美化的字典。。

    def fun_beautify(self,sheet_name,dict):
        self.sheet = self.excel[sheet_name]
        self.column_styles = dict

        for self.column in self.sheet.columns:

            self.column_letter = self.column[0].column_letter
            # print(self.column_letter)#即ABCD.....

            if self.column_letter in self.column_styles:
                self.style = self.column_styles[self.column_letter]

                self.sheet.column_dimensions[self.column_letter].width = self.style["width"]#设置列宽

                for self.cell in self.column:
                    self.cell.border = self.style["border"]  # 边框

                    if self.cell.value == 0 or self.cell.value =="0":
                        self.cell.value = None
                    else:

                        self.cell.font = self.style["font"]#字体
                        self.cell.alignment = self.style["alignment"]#居中方式
                        self.sheet.row_dimensions[self.cell.row].height = 27#调整行高



这个是我遍历的方法,,,fun_beautify传入的dict就是一开始那个字典,,,

如果我遍历的过程中,如果这个value == None,那么就pass,否则,就cell.value = 美化字典中的value。。。得怎么样实现这个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 20:46:02 | 显示全部楼层
FishC 发表于 2024-6-5 20:43
在遍历过程中,如果字典中的`value`为`None`,你可以使用条件判断进行处理。以下是修改后的代码示例:
...

你这样是根据self.cell.value是否是空来判断,,

我是想直接判断self.style['value']是否等于None来判断,,如果是,就pass,否则就self.cell.value == self.style['value']
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 20:52:13 | 显示全部楼层
FishC 发表于 2024-6-5 20:46
非常抱歉,我之前的回答有误解。如果你想根据`self.style`是否为`None`来判断是否应用样式,可以如下进 ...

    if self.style["value"] is not None:
KeyError: 'value'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 21:11:59 | 显示全部楼层
FishC 发表于 2024-6-5 20:52
非常抱歉,我之前的回答有误。在`self.column_styles`字典中,并没有`value`这个键值对应的数据。你可 ...

不用了,,我知道为什么了,,因为我这个模版是套了5个美化方案的,刚才只在一个方案里面增加了value,,另外四个没有,,,现在把另外4个加上value之后就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-8 06:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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