请教大佬们如何用 pandas 高效读取被分片的 csv 文件 - 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
sdushn
0D
V2EX    Python

请教大佬们如何用 pandas 高效读取被分片的 csv 文件

  •  
  •   sdushn 2021-02-07 16:24:39 +08:00 2633 次点击
    这是一个创建于 1755 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    使用 pandas 库处理一个性能参数的 csv 文件,但是 csv 文件是分片的,格式如下

    time A B C D
    20:00 0 1 2 3
    time E F G H
    20:00 4 5 6 7
    ...

    现在想读成如下格式,存成一个 dataframe 便于下游继续处理

    time A B C D E F G H ...
    20:00 0 1 2 3 4 5 6 7 ...

    现在方案及问题

    现在是通过跳过 n 行读取,然后拼接的方案,会存在多次调用 pandas.read_csv,性能太差了,想请教一个 python 大佬们有什么高效的办法

    pandas.read_csv(target_file, skiprows=skip_rows, nrows=range, skipinitialspace=True) skip_rows = skip_rows + range

    14 条回复    2021-02-09 17:17:56 +08:00
    lpts007
        1
    lpts007  
       2021-02-07 16:36:41 +08:00 via Android
    哪边产生的这种文件,让他改
    sdushn
        2
    sdushn  
    OP
       2021-02-07 16:44:26 +08:00
    @lpts007 上下游都搞不定啊,难顶,只能自己处理了,又赶上鄙人不擅长 python T-T
    starzh
        3
    starzh  
       2021-02-07 16:57:57 +08:00
    或者先把文件切片再喂给 pandas,这样读取的次数会少一些
    starzh
        4
    starzh  
       2021-02-07 17:00:57 +08:00
    假如按照你的例子,字段从 A 到 L,那就把文件分成 3 个小文件,这样 pandas 就只用读 3 次,最后再把 3 个 dataframe 拼起来就好了
    nano91
        5
    nano91  
       2021-02-07 17:06:29 +08:00
    都在一个 csv 文件,那你一次性读完,然后筛不就行了,读完后 EFGH 被当成了行数据,这样的话,你把 EFGH 这种行数据给筛掉不就行了,再不济,既然你已经有 skip 的解决方法,就说明每个分片的长度是固定的,那就先转 list,[begin:end:skip]做切片然后转回 dataframe 不就行了
    nano91
        6
    nano91  
       2021-02-07 17:07:48 +08:00
    @nano91 dataframe 也可以直接切片,具体可以自己看看
    learningman
        7
    learningman  
       2021-02-07 17:14:40 +08:00
    换 C++预处理(
    C++处理 csv 还算能写
    sdushn
        8
    sdushn  
    OP
       2021-02-07 17:15:01 +08:00
    @starzh
    @nano91
    目前是计划先一次性读取,在给 pandas 之前处理好,按行读取,按分片逻辑把竖着的表处理成横着的,最后一次性给 pandas 转 dataframe
    sdushn
        9
    sdushn  
    OP
       2021-02-07 17:16:22 +08:00
    @learningman 流下了没有技术的泪水,C++更不会写了
    nano91
        10
    nano91  
       2021-02-07 17:23:09 +08:00
    @sdushn 不用横过来,直接 dataframe 切片,每行就是一个元素
    sdushn
        11
    sdushn  
    OP
       2021-02-07 17:27:34 +08:00
    @nano91 我去研究一下
    cassidyhere
        12
    cassidyhere  
       2021-02-07 23:29:14 +08:00 via Android
    各位想复杂了,pandas.read_csv 有现成的 chunksize 参数
    xchaoinfo
        13
    xchaoinfo  
       2021-02-08 09:52:18 +08:00 via Android
    如果你用 Excel 应该怎么处理?
    pandas 当成一个可编程的 Excel 。对比下,操作罗辑就很清楚了
    Yinz
        14
    Yinz  
       2021-02-09 17:17:56 +08:00
    @sdushn #8 你的计划是对的,一次文件读取,处理成 dict (可流处理),转成 DataFrame 就可以了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1032 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:36 PVG 07:36 LAX 15:36 JFK 18:36
    Do have faith in what you're doing.
    ubao msn 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