V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Lynnnn
V2EX  ›  Python

请问有 1000W+行的数据(excel 表格),如何合并处理?

  •  
  •   Lynnnn · 2024-01-19 10:55:03 +08:00 · 3420 次点击
    这是一个创建于 377 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下 V 友,我请 IT 后台帮忙拉出大概 1300W 行左右的数据,分了 20 几个 excel 表给给我,1 个文件约 60-70W 行。 需求是想从这些数据里面提取需要是数据,然后做一些透视汇总什么的。

    之前想的处理逻辑是:(1)先 pandas 合并所有表格(2)数据处理后导出。

    碰到的问题是:pandas 处理不了这么大量是数据,多个文件合并卡死了。经过网上搜索一翻,装了 modin ,目前试验下来 3,4 个文件一合并不会报错,但是再多了也不行。

    想请问 V 友还有没有更合适的工具?最好也是支持 pandas 语法的。

    ——————

    P.S.我没有连后台数据库的权限(给了也不会,不懂数据库),也不方便请 IT 做预处理再导给我。 是不是只能考虑单个文件处理,然后再逐一合并结果了?但是有一些处理逻辑是需要几张汇总起来后才能写判断的。

    35 条回复    2024-04-30 21:59:16 +08:00
    liprais
        1
    liprais  
       2024-01-19 10:58:00 +08:00
    自己整到 sqlite 里面写 sql 完事
    lcy630409
        2
    lcy630409  
       2024-01-19 10:58:29 +08:00
    自己本机装个 mysql ,建表,然后 Navicat 导入 excel ,再从 mysql 中提取数据
    你的需求不是 excel 能搞定的
    h157
        3
    h157  
       2024-01-19 10:58:40 +08:00
    这数据量,用 vba 多表汇总试试
    zh584728
        4
    zh584728  
       2024-01-19 11:15:07 +08:00
    直接 pandas.concat 合并不行吗,百万级别的数据我都合并过,当然我是在服务器上合并的
    vvhy
        5
    vvhy  
       2024-01-19 11:17:22 +08:00
    excel 表格最多 1048576 行
    Moeblack
        6
    Moeblack  
       2024-01-19 11:18:38 +08:00
    我最近弄了一个 1000w 行的数据(Gelbooru metainfo ) csv 文件,用 sqlite 弄的
    suibianwanwan
        7
    suibianwanwan  
       2024-01-19 11:19:43 +08:00
    如果你电脑配置不错, 1300w 行, 一个 excel 就可以导出来了, 分 13 个 sheet, 每个 sheet100w 行
    就是打开有点费劲, 毕竟文件太大了
    Alias4ck
        8
    Alias4ck  
       2024-01-19 11:20:41 +08:00
    polars
    Worldispow
        9
    Worldispow  
       2024-01-19 11:23:53 +08:00
    合并不了,excel 最大行是 1048576 ,即便显示合并成功,excel 也会显示不全。
    我一般是直接导出 csv 文件,然后再放到 oracle 里面分析。
    需要做图啥的话用 Tableau 、帆软之类的 bi 软件。
    Worldispow
        10
    Worldispow  
       2024-01-19 11:24:56 +08:00
    如果你想用 pandas 分析,可以让运维导出 csv 格式,csv 没问题。
    Horance
        11
    Horance  
       2024-01-19 11:50:00 +08:00
    可以看下这个 https://mp.weixin.qq.com/s/BARSLv1Ua4hxdsZRntCnQg ,我曾经合并过几百万个 csv 文件差不多 1 0000 0000 条数据也可以在 1 个小时内完成,当然和列数有关,具体看你数据复杂度。
    Lynnnn
        12
    Lynnnn  
    OP
       2024-01-19 11:58:50 +08:00
    感谢各位 V 友回复,我可能没表达清楚。
    目前 1000W 数据是已经导出成 excel 表格,分了 20 多个文件,每个文件 1 个 sheet 。这些就是我的数据源了。后面所有处理都是基于这个。

    然后最后我需要的结果,处理完完成导出的文件是非常小的,就 1 个 excel 的行数就能容纳,并不是导出结果也是 1000W 的行数据,这里补充说明一下。

    我目前的问题是:处理过程中,合并 1000W 行数据报错,本地电脑发现上了 modin 也不行。

    所以思路是调整工具?变更代码处理逻辑?
    cvbnt
        13
    cvbnt  
       2024-01-19 12:13:44 +08:00 via Android
    chatgpt 问一下?
    TimePPT
        14
    TimePPT  
       2024-01-19 12:22:18 +08:00
    如果只涉及统计 excel 行数,这事就简单了。

    不上代码了,直接说思路,python+pandas 方便很多

    待处理 excel 放一个文件夹

    使用 pandas 创建一个 dataframe ,列名:excel 文件名,行数,(有必要的话可以列数,甚至可以列名拿出来)

    标准库 pathlib 拿到所有 xls/xlsx 文件 path
    循环遍历这些 path
    with Path.open as f 读取文件
    读取 excel 内容到 pandas 的 dataframe
    获取文件名,行数,并记录到开头新建的 dataframe 里

    循环遍历完后,df.to_excel 导出统计文件
    Betsy
        15
    Betsy  
       2024-01-19 12:49:53 +08:00 via iPhone
    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

    基于上述的代码将 Excel 导入到 SQLite ,然后按照你熟悉的方式操作 DataFrame 。

    SQLite 就在本地,也不需要什么数据库权限和 it 小伙伴支援。
    a1b2c3T
        16
    a1b2c3T  
       2024-01-19 12:55:34 +08:00 via iPhone
    用 emeditor 试试,
    a302800411
        17
    a302800411  
       2024-01-19 13:01:12 +08:00 via iPhone
    不需要 pandas 库合并成一个 excel

    直接几千万行数据全读取到内存里,然后直接用 Python 完成你要的数据分析就行了
    beyondstars
        18
    beyondstars  
       2024-01-19 13:05:17 +08:00
    1. 把每个小表格文件自己转成 csv 格式,或者让运维给你 csv 格式的,文件名编好顺序,例如 1.csv, 2.csv, ..., N.csv ;
    2. 把每个文件的第一行去掉,但是要留一份出来单独保存,例如 head.csv;
    3. 确保每个 csv 文件的最后一个字符一定是有且仅有一个换行符,然后按顺序合并下列文件 head.csv, 1.csv, ..., N.csv;
    CaptainD
        19
    CaptainD  
       2024-01-19 13:54:52 +08:00
    pandas 理论上几千万数据没问题的,除非你的机器性能不太行或者你得 excel 列太多或者你代码有问题,可以把代码或者数据实例发上来看看,我经常用 pandas 做数分,几千万数据,十几列或者更多,都没问题,32g 内存足以
    noparking188
        20
    noparking188  
       2024-01-19 14:08:27 +08:00
    试试直接 PySpark 单机跑,API 接口和 pandas 差不多,记得用 3.3 及以上版本的,可以直接读批量 Excel
    sunmker
        21
    sunmker  
       2024-01-19 14:26:08 +08:00
    让 it 导出 csv 的数据,1300w 行,再用 pandas 导入处理
    Battle
        22
    Battle  
       2024-01-19 14:46:41 +08:00
    grep sed awk
    ohayoo
        23
    ohayoo  
       2024-01-19 14:46:44 +08:00
    pandas 处理应该是没问题的,我曾经甚至用 pandas 处理过 nginx 日志分析,日志以亿条为单位都没问题,用 chunksize ,分段读取,避免内存吃不消
    deweixu
        24
    deweixu  
       2024-01-19 15:16:24 +08:00
    导出 csv ,cat awk sed grep ,,,哈哈哈哈哈
    ntedshen
        25
    ntedshen  
       2024-01-19 15:30:01 +08:00
    xlsx 这玩意感觉三方读取普遍有问题,数值还行主要是那个 sharedStrings.xml 的字典,之前用 java 导出一份两百多万行的用户数据的时候用了 70g 内存。。。
    要么转 csv 或者 json 处理要么给个巨大内存的机器让他自己龟爬。。。
    djangovcps
        26
    djangovcps  
       2024-01-19 15:30:37 +08:00
    报什么错? OOM 内存溢出? 自己写分块处理逻辑吧,不行就存 mysql 里;
    iv8d
        27
    iv8d  
       2024-01-19 16:11:22 +08:00
    导入数据库,处理完了再导出为 excel
    ktyang
        28
    ktyang  
       2024-01-19 16:13:16 +08:00
    换个格式。。。
    Lynnnn
        29
    Lynnnn  
    OP
       2024-01-19 18:35:27 +08:00
    谢谢各位回复,源数据我先转成 csv ,准备先试试下面 3 种方案:
    (1)导入数据库 mysql/sqlite
    (2)换 polars
    (3)换 PySpark
    (4)控制内存

    合并成 1 个文件只在 python 数据处理过程中,会要在 jupyter 里面预览一下效果,不导出。等全部处理完导出的只是一个比较小的文件。

    应该是上面几楼说的内存的问题,普通办公人员电脑配置不太行,但用 PowerBI 更卡...
    不过数据库和内存控制都没搞过,我先研究一下再反馈。

    再次谢谢!
    akira
        30
    akira  
       2024-01-19 20:09:03 +08:00
    excel 不支持 1000W 行的数据。别往这个方向浪费精力。 直接代码处理吧
    troywinter
        31
    troywinter  
       2024-01-19 23:50:36 +08:00
    z1829909
        32
    z1829909  
       2024-01-20 03:43:19 +08:00
    把 excel 都读取一遍, 写入到自己电脑搭建的数据库, 然后直接 sql 处理. 如果不会的话可以学学, 成本不算太高
    aec4d
        33
    aec4d  
       2024-01-20 09:35:17 +08:00
    duckdb or clickhouse
    i690531336
        34
    i690531336  
       339 天前
    放数据库操作就比较方便
    vincentqiao
        35
    vincentqiao  
       274 天前 via iPhone
    最近也碰到这个问题,发现不管是 pandas 还是 polars ,读取大型.xlsx 文件都很吃力。
    最好的解决办法还是 csv 。pandas 或者 polars 都很快
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1784 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 08:18 · PVG 16:18 · LAX 00:18 · JFK 03:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.