当前位置: 首页 > 知识库问答 >
问题:

在笔记本中上传大csv文件以使用python熊猫的最快方法是什么?

充栋
2023-03-14

我正试图上传一个250 MB的csv文件。基本上是400万行6列的时间序列数据(1分钟)。通常的程序是:

location = r'C:\Users\Name\Folder_1\Folder_2\file.csv'
df = pd.read_csv(location)

这个过程大约需要20分钟!!!。非常初步,我已经探索了以下选项

  • 分块上传,然后把这些块放在一起
  • HDF5
  • “羽毛”
  • “泡菜”

我想知道是否有人比较了这些选项(或更多),并且有一个明显的赢家。如果没有人回答,将来我会公布我的结果。我只是现在没有时间。

共有2个答案

车峻熙
2023-03-14

您可以使用datatable加载csv文件,然后将其转换为pandas dataframe,这比使用pandas read_csv()加载要快得多

import datatable as dt

dt_df = dt.fread(csv_file)
pd_df = dt_df.to_pandas()

在1 Go的csv文件中,熊猫读取_csv大约需要34分钟,而datable fread只需要40秒,这是一个巨大的差异(x51更快)。

您也可以只使用可数据化的数据帧,而不需要转换为熊猫数据帧(这取决于您想要的功能)。可数据化的有用介绍:https://www.kaggle.com/sudalairajkumar/getting-started-with-python-datatable

井誉
2023-03-14

以下是我对DF的读写比较结果(形状:4000000x6,内存大小183.1MB,未压缩CSV大小-492MB)。

以下存储格式的比较:(CSVCSV.gzipPickleHDF5[各种压缩]):

                  read_s  write_s  size_ratio_to_CSV
storage
CSV               17.900    69.00              1.000
CSV.gzip          18.900   186.00              0.047
Pickle             0.173     1.77              0.374
HDF_fixed          0.196     2.03              0.435
HDF_tab            0.230     2.60              0.437
HDF_tab_zlib_c5    0.845     5.44              0.035
HDF_tab_zlib_c9    0.860     5.95              0.035
HDF_tab_bzip2_c5   2.500    36.50              0.011
HDF_tab_bzip2_c9   2.500    36.50              0.011

阅读

写入/保存

与未压缩CSV文件相关的文件大小比

原始数据:

CSV:

In [68]: %timeit df.to_csv(fcsv)
1 loop, best of 3: 1min 9s per loop

In [74]: %timeit pd.read_csv(fcsv)
1 loop, best of 3: 17.9 s per loop

CSV。gzip:

In [70]: %timeit df.to_csv(fcsv_gz, compression='gzip')
1 loop, best of 3: 3min 6s per loop

In [75]: %timeit pd.read_csv(fcsv_gz)
1 loop, best of 3: 18.9 s per loop

泡菜:

In [66]: %timeit df.to_pickle(fpckl)
1 loop, best of 3: 1.77 s per loop

In [72]: %timeit pd.read_pickle(fpckl)
10 loops, best of 3: 173 ms per loop

HDF(format='fixed')[默认值]:

In [67]: %timeit df.to_hdf(fh5, 'df')
1 loop, best of 3: 2.03 s per loop

In [73]: %timeit pd.read_hdf(fh5, 'df')
10 loops, best of 3: 196 ms per loop

HDF(格式='table'):

In [37]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab.h5', 'df', format='t')
1 loop, best of 3: 2.6 s per loop

In [38]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab.h5', 'df')
1 loop, best of 3: 230 ms per loop

HDF(format='table',complib='zlib',complevel=5):

In [40]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib5.h5', 'df', format='t', complevel=5, complib='zlib')
1 loop, best of 3: 5.44 s per loop

In [41]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib5.h5', 'df')
1 loop, best of 3: 854 ms per loop

HDF(format='table',complib='zlib',complevel=9):

In [36]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib9.h5', 'df', format='t', complevel=9, complib='zlib')
1 loop, best of 3: 5.95 s per loop

In [39]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib9.h5', 'df')
1 loop, best of 3: 860 ms per loop

HDF(format='table',complib='bzip2',complevel=5):

In [42]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l5.h5', 'df', format='t', complevel=5, complib='bzip2')
1 loop, best of 3: 36.5 s per loop

In [43]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l5.h5', 'df')
1 loop, best of 3: 2.5 s per loop

HDF(格式='table',兼容b='bzip2',完成=9):

In [42]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l9.h5', 'df', format='t', complevel=9, complib='bzip2')
1 loop, best of 3: 36.5 s per loop

In [43]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l9.h5', 'df')
1 loop, best of 3: 2.5 s per loop

PS我不能在我的Windows笔记本上测试feather

DF信息:

In [49]: df.shape
Out[49]: (4000000, 6)

In [50]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4000000 entries, 0 to 3999999
Data columns (total 6 columns):
a    datetime64[ns]
b    datetime64[ns]
c    datetime64[ns]
d    datetime64[ns]
e    datetime64[ns]
f    datetime64[ns]
dtypes: datetime64[ns](6)
memory usage: 183.1 MB

In [41]: df.head()
Out[41]:
                    a                   b                   c  \
0 1970-01-01 00:00:00 1970-01-01 00:01:00 1970-01-01 00:02:00
1 1970-01-01 00:01:00 1970-01-01 00:02:00 1970-01-01 00:03:00
2 1970-01-01 00:02:00 1970-01-01 00:03:00 1970-01-01 00:04:00
3 1970-01-01 00:03:00 1970-01-01 00:04:00 1970-01-01 00:05:00
4 1970-01-01 00:04:00 1970-01-01 00:05:00 1970-01-01 00:06:00

                    d                   e                   f
0 1970-01-01 00:03:00 1970-01-01 00:04:00 1970-01-01 00:05:00
1 1970-01-01 00:04:00 1970-01-01 00:05:00 1970-01-01 00:06:00
2 1970-01-01 00:05:00 1970-01-01 00:06:00 1970-01-01 00:07:00
3 1970-01-01 00:06:00 1970-01-01 00:07:00 1970-01-01 00:08:00
4 1970-01-01 00:07:00 1970-01-01 00:08:00 1970-01-01 00:09:00

文件大小:

{ .data }  » ls -lh 37010212.*                                                                          /d/temp/.data
-rw-r--r-- 1 Max None 492M May  3 22:21 37010212.csv
-rw-r--r-- 1 Max None  23M May  3 22:19 37010212.csv.gz
-rw-r--r-- 1 Max None 214M May  3 22:02 37010212.h5
-rw-r--r-- 1 Max None 184M May  3 22:02 37010212.pickle
-rw-r--r-- 1 Max None 215M May  4 10:39 37010212_tab.h5
-rw-r--r-- 1 Max None 5.4M May  4 10:46 37010212_tab_compress_bzip2_l5.h5
-rw-r--r-- 1 Max None 5.4M May  4 10:51 37010212_tab_compress_bzip2_l9.h5
-rw-r--r-- 1 Max None  17M May  4 10:42 37010212_tab_compress_zlib5.h5
-rw-r--r-- 1 Max None  17M May  4 10:36 37010212_tab_compress_zlib9.h5

结论:

PickleHDF5要快得多,但是HDF5更方便-您可以在里面存储多个表/帧,您可以有条件地读取您的数据(查看在read_hdf()中的参数),您还可以存储压缩的数据(zlib-更快,bzip2-提供更好的压缩比)等。

PS如果你能构建/使用羽毛格式——它应该比HDF5Pickle更快

PPS:不要对大数据帧使用Pickle,因为最终可能会出现SystemError:error return without exception set error message。这里和这里也有描述。

 类似资料:
  • 问题内容: 我有一个十列的简单csv文件! 当我在笔记本中设置以下选项并打印我的csv文件(位于pandas数据框中)时,它不会从左到右打印所有列,而是打印前两列,下两列,依此类推。 我使用了此选项,为什么它不起作用? 即使这样似乎也不起作用: 问题答案: 我假设您要在笔记本中显示数据,但以下选项对我来说效果很好(IPython 2.3): 直接设置选项 或者,使用您显示的set_option方法

  • 我运行了以下脚本(https://github.com/FXCMAPI/FXCMTickData/blob/master/TickData34.py)并在末尾添加以下行以下载文件: 然后,我尝试使用pandas打开文件,如下所示: 然而,我得到的是: 为什么数据框是空的? 如果我在TextEdit上打开文件,前几行实际上如下所示:

  • 我在一个特定的文件夹中有很多CSV文件。我想检查其中的每个文件是否为空,如果是,请打印其名称。 文件夹: 预期产出:

  • 我试图加载一个csv文件内基于熊猫的数据帧。我使用了以下导入。 没有找到文件是抛出错误,回溯如下: ()中的FileNotFoundError回溯(最近一次调用)---- c:\users\saish\appdata\local\programs\python\python35-32\lib\site packages\pandas\io\parsers。语法分析器中的py\u f(文件路径或缓冲

  • 问题内容: 这个问题已经在这里有了答案 : Python中的Windows路径 (5个答案) 4年前关闭。 追溯(最近一次通话): 产品中的文件“”,第1行= pd.read_csv(’C:\ amazon_baby.csv’) 在parser_f中的第562行的文件“ C:\ Users \ kvsn \ Anaconda3 \ lib \ site-packages \ pandas \ io

  • 问题内容: 我所工作的公司最近在我们托管的站点上遭受了许多标头注入和文件上传攻击,尽管我们已解决了标头注入攻击的问题,但我们仍未控制上载攻击。 我正在尝试建立一系列即插即用型上传脚本,以供内部使用,设计人员可以将其复制到其网站的结构中,修改一些变量,并在其上准备一个随时可以上传的表单他们的网站。我们正在寻求尽可能限制暴露的机会(我们已经关闭了fopen和shell命令)。 我在过去一个小时内对该网