• python用pandas库写入xlsx文件时速度过慢如何优化


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 refrain_ct 2024-04-02 22:47 采纳率: 33.3% 浏览 3 首页/ 编程语言 / python用pandas库写入xlsx文件时速度过慢如何优化 python数据结构哈希算法 本人在校学生 自学不太明白 经过本人不严谨测试发现问题出在df.to_excel这里 因为写入的数据大概在90+列 50w+行 导致一直卡在这里 具体多久跑完不知道(跑了几十分钟没跑完)并且16g内存爆满有没有可以提升处理效率的方法感激不尽 for file_name_csv in os.listdir(Excel_csv_folder): if file_name_csv.endswith('.csv'): df = pd.read_csv(os.path.join(Excel_csv_folder, file_name_csv)) xlsx_filename = file_name_csv.replace('.csv', '.xlsx') df.to_excel(os.path.join(Excel_elsx_folder, xlsx_filename), index=False) for file_name in os.listdir(Excel_elsx_folder): if file_name.endswith('.xlsx'): excel_file_path =os.path.join(Excel_elsx_folder,file_name) # 读取Excel文件 df = pd.read_xlsx(excel_file_path) # 遍历B列的每一行元素,匹配字典中的值,并将对应的键写入A列相同的行 for index, row in df.iterrows(): # 获取B列的元素值 value_in_D = row['Indicator Code'] # 在字典中查找匹配的键 corresponding_key_IDC = IDC_dict.get(value_in_D) if corresponding_key_IDC != None: df.at[index,'Indicator Code'] = corresponding_key_IDC # 将修改后的DataFrame写回Excel文件 df.to_xlsx(excel_file_path, index=False) 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 檀越剑指大厂 Java领域优质创作者 2024-04-02 22:47
      关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      当处理大量数据时,Pandas的性能可能会受到限制。在处理上千行和上百列的数据时,可能会遇到内存不足和执行速度慢的问题。为了优化Pandas的性能,你可以尝试以下几个方法:

      1. 批量处理: 一次性处理所有的CSV文件,而不是逐个读取和写入。这样可以减少IO操作的次数,提高处理效率。你可以使用多线程或并行计算库(如Dask或Joblib)来并行处理多个CSV文件。

      2. 适当选择数据类型: 尽量使用适当的数据类型来存储数据,以减少内存占用。例如,将数值列转换为具体的数值类型(如int、float),将字符型列转换为category类型。

      3. 使用chunksize参数: 如果内存不足,你可以尝试使用chunksize参数来分块读取CSV文件,将数据分成多个小块进行处理,然后再将结果合并。这可以减少内存的使用量。

      4. 使用compression参数: 如果CSV文件较大,你可以考虑使用compression参数来压缩输出的xlsx文件,这可以减少磁盘空间的占用。

      5. 避免多次写入: 你可以在内存中对数据进行处理,然后一次性写入到xlsx文件。这样可以减少写入操作的次数,提高效率。

      以下是修改后的代码示例:

      import os
      import pandas as pd
      
      for file_name_csv in os.listdir(Excel_csv_folder):
          if file_name_csv.endswith('.csv'):
              csv_file_path = os.path.join(Excel_csv_folder, file_name_csv)
              xlsx_file_path = os.path.join(Excel_elsx_folder, file_name_csv.replace('.csv', '.xlsx'))
      
              # 读取CSV文件,设定适当的数据类型
              dtypes = {'Indicator Code': 'category'}
              df_chunks = pd.read_csv(csv_file_path, dtype=dtypes, chunksize=1000)
      
              writer = pd.ExcelWriter(xlsx_file_path, engine='xlsxwriter')
      
              for i, chunk in enumerate(df_chunks):
                  # 在内存中对数据进行处理
                  chunk['Indicator Code'] = chunk['Indicator Code'].map(IDC_dict)
      
                  # 将处理后的数据写入到xlsx文件的不同sheet中
                  chunk.to_excel(writer, sheet_name=f'Sheet{i+1}', index=False)
      
              writer.save()
              writer.close()
      

      展开全部

      评论 编辑记录
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-04 01:50
      关注

      【以下回答由 GPT 生成】

      优化建议:

      1. 使用适当的数据类型

      在处理大型数据集时,使用合适的数据类型可以显著提高性能。确保将数值列转换为适当的数据类型,例如将整数列转换为int32int64,将浮点数列转换为float32float64

      # 例如,将DataFrame中的数值列转换为适当的数据类型
      df = df.astype({'column_name': 'int32'})
      

      2. 使用chunksize参数分块写入数据

      如果DataFrame的大小超出内存限制,可以尝试使用chunksize参数将数据分块写入Excel文件。

      # 将数据分块写入Excel文件
      writer = pd.ExcelWriter(output_file_path)
      for chunk in pd.read_csv(input_file_path, chunksize=10000):
          chunk.to_excel(writer, index=False, sheet_name='Sheet1', startrow=startrow, startcol=startcol)
          startrow += len(chunk.index)
      writer.save()
      

      3. 使用openpyxl引擎

      尝试使用openpyxl引擎替代默认的xlsxwriter引擎,因为openpyxl具有更好的性能和内存管理。

      # 通过传递engine参数来指定使用openpyxl引擎
      df.to_excel(output_file_path, engine='openpyxl', index=False)
      

      4. 避免重复读取和写入文件

      在你的代码中,避免在循环中重复读取和写入文件,可以先处理数据,然后一次性写入Excel文件。

      5. 使用并行处理

      尝试使用并行处理来加快数据处理和写入速度,可以使用multiprocessing库来实现并行处理数据。

      from multiprocessing import Pool
      
      def process_data(file_path):
          # 处理数据的函数
          pass
      
      if __name__ == '__main__':
          files = [file for file in os.listdir(Excel_csv_folder) if file.endswith('.csv')]
      
          with Pool(processes=4) as pool:  # 可以根据CPU核心数调整进程数
              pool.map(process_data, files)
      

      希望这些优化建议对你有所帮助。如有任何疑问,请随时向我提问。



      【相关推荐】



      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    记一次 .NET 某汽贸店 CPU 爆高分析
    分布式.性能优化
    【地平线旭日X3派试用体验】从开机到点灯(第一节)
    服务器硬件基础知识
    VS2019如何新建Win32项目(即MFC项目)
    python+appium自动化测试如何控制App的启动和退出
    151. 关于 SAP UI5 XML 视图里控件事件处理函数名称中的 . (点号) 问题的讨论
    ElasticSearch系列——Kibana,核心概念
    c++中的智能指针详解
    ctrl+delete删除怎么恢复?实用小技巧分享
  • 原文地址:https://ask.csdn.net/questions/8082979