小编kay*_*yoz的帖子

对于非数字数据,Pandas read_hdf非常慢

当我读取一个大的hdf文件时,pandas.read_hdf()我的读取时间非常慢.我的hdf有5000万行,3列有整数,2列有字符串.使用to_hdf()表格格式和索引编写这个花了将近10分钟.虽然这也很慢,但我并不太关心,因为读取速度更重要.

我尝试保存为固定/表格格式,有/无压缩,但读取时间范围在2-5分钟之间.相比之下,read_csv()相同的数据需要4分钟.

我也尝试直接使用pytables读取hdf.这在6秒时快得多,这将是我希望看到的速度.

h5file = tables.open_file("data.h5", "r")
table = h5file.root.data.table.read()
Run Code Online (Sandbox Code Playgroud)

我注意到文档中的所有速度比较仅使用数字数据,并且我自己运行这些数据也达到了类似的性能.

我想问一下,我是否可以采取一些措施来优化读取性能?

编辑

这是一个数据样本

               col_A     col_B    col_C     col_D                 col_E
30649671  1159660800  10217383        0  10596000                LACKEY
26198715  1249084800   0921720        0         0           KEY CLIFTON
19251910   752112000   0827092      104    243000                WEMPLE
47636877  1464739200  06247715        0         0                 FLOYD
14121495  1233446400  05133815        0    988000        OGU ALLYN CH 9
41171050  1314835200  7C140009        0     39000             DEBERRY A
45865543  1459468800   0314892       76    254000               SABRINA
13387355   970358400  04140585       19   6956000              LA PERLA
4186815 …
Run Code Online (Sandbox Code Playgroud)

python performance python-3.x pandas hdf

5
推荐指数
1
解决办法
1247
查看次数

按类别过滤熊猫数据框的最快方法

我有一个非常大的数据框,有 1 亿行和分类列。我想知道是否有比使用这里提到的.isin()方法或.join()方法更快的按类别选择行的方法。

鉴于数据已经分类,我认为选择类别应该非常快,但我运行的一些测试表现令人失望。我找到的唯一其他解决方案来自此处,但该解决方案似乎不适用于 Pandas 0.20.2。

这是一个示例数据集。

import pandas as pd
import random
import string
df = pd.DataFrame({'categories': [random.choice(string.ascii_letters) 
                                  for _ in range(1000000)]*100,
                   'values': [random.choice([0,1]) 
                              for _ in range(1000000)]*100})
df['categories'] = df['categories'].astype('category')
Run Code Online (Sandbox Code Playgroud)

测试.isin()

%timeit df[df['categories'].isin(list(string.ascii_lowercase))]
44 s ± 894 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)

使用.join()

%timeit df.set_index('categories').join(
    pd.Series(index=list(string.ascii_lowercase), name='temp'), 
    how='inner').rename_axis('categories').reset_index().drop('temp', 1)
24.7 s ± 1.69 s per loop (mean ± …
Run Code Online (Sandbox Code Playgroud)

python performance pandas

5
推荐指数
1
解决办法
4816
查看次数

标签 统计

pandas ×2

performance ×2

python ×2

hdf ×1

python-3.x ×1