将python迭代器输出转换为pandas数据帧的最快方法

Jam*_*mes 6 python pandas

我有一个生成器,它返回我想要转换为索引的pandas数据帧的未知数量的数据行.我所知道的最快的方法是将CSV写入磁盘,然后通过'read_csv'解析.我知道创建一个空数据帧然后不断追加新行是没有效率的.我无法创建预先调整大小的数据帧,因为我不知道将返回多少行.有没有办法将迭代器输出转换为pandas数据帧而无需写入磁盘?

Jam*_*mes 9

迭代地附加到pandas数据帧并不是最好的解决方案.最好将数据构建为列表,然后将其传递给pd.DataFrame.

import random
import pandas as pd

alpha = list('abcdefghijklmnopqrstuvwxyz')
Run Code Online (Sandbox Code Playgroud)

这里我们创建一个生成器,用它来构造一个列表,然后将它传递给dataframe构造函数:

%%timeit
gen = ((random.choice(alpha), random.randint(0,100)) for x in range(10000))
my_data = [x for x in gen]
df = pd.DataFrame(my_data, columns=['letter','value'])

# result: 1 loop, best of 3: 373 ms per loop
Run Code Online (Sandbox Code Playgroud)

这比创建生成器,构造空数据帧和追加行要快得多,如下所示:

%%timeit
gen = ((random.choice(alpha), random.randint(0,100)) for x in range(10000))
df = pd.DataFrame(columns=['letter','value'])
for tup in gen:
    df.loc[df.shape[0],:] = tup

# result: 1 loop, best of 3: 13.6 s per loop
Run Code Online (Sandbox Code Playgroud)

这在构造10000行的13秒内非常慢.

  • 我一定错过了一些明显的东西。为什么将生成器扁平化为列表而不是简单地将生成器直接传递到数据框构造函数中?`pd.DataFrame(gen, columns=['letter','value'])` 每次对我来说比 `pd.DataFrame(list(gen), columns=['letter','value'])` 计算得更快 (2认同)