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 · 286 天前 · 3209 次点击
    这是一个创建于 286 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    所以思路是调整工具?变更代码处理逻辑?
    cvbnt
        13
    cvbnt  
       286 天前 via Android
    chatgpt 问一下?
    TimePPT
        14
    TimePPT  
       286 天前
    如果只涉及统计 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  
       286 天前 via iPhone
    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

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

    SQLite 就在本地,也不需要什么数据库权限和 it 小伙伴支援。
    a1b2c3T
        16
    a1b2c3T  
       286 天前 via iPhone
    用 emeditor 试试,
    a302800411
        17
    a302800411  
       286 天前 via iPhone
    不需要 pandas 库合并成一个 excel

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

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

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

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