请问有 1000W+行的数据(excel 表格),如何合并处理? - V2EX
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 4025 次点击
    这是一个创建于 632 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下 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
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       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 多表汇总试试
    LuJason
        4
    LuJason  
       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  
    PRO
       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 试试,
    SkyEcho
        17
    SkyEcho  
       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
    adgfr32
        32
    adgfr32  
       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  
       2024-02-26 09:58:19 +08:00
    放数据库操作就比较方便
    vincentqiao
        35
    vincentqiao  
       2024-04-30 21:59:16 +08:00 via iPhone
    最近也碰到这个问题,发现不管是 pandas 还是 polars ,读取大型.xlsx 文件都很吃力。
    最好的解决办法还是 csv 。pandas 或者 polars 都很快
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2815 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 13:27 PVG 21:27 LAX 06:27 JFK 09:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86