加快pd.concat速度或使用其他方法联接表的方法

时间:2019-10-21 04:33:45

标签: python python-3.x pandas

dfs=[]

for i in range(387):
    print(i)
    dfs.append(pd.DataFrame(0, index=range(121211), columns=range(31)))

pd.concat(dfs,axis=1) #can only change this

在上面的代码中,pd.concat相当慢,有没有办法使列联接更快?假设我只能更改pd.concat部分。

2 个答案:

答案 0 :(得分:1)

您正在实例化一个非常大的数据帧,所有数据帧均包含零值。与其连接,不如将数据框构造函数与所需的索引和列一起使用。

dfs = pd.DataFrame(
    0, 
    index=range(121211), 
    columns=list(range(31)) * 387
)

例如(使用小得多的数据框):

>>> pd.DataFrame(0, index=range(3), columns=list(range(2)) * 3)
   0  1  0  1  0  1
0  0  0  0  0  0  0
1  0  0  0  0  0  0
2  0  0  0  0  0  0

编辑

假设每个数据帧具有相同的索引,不同的列和不同的值,请尝试直接串联numpy值(避免concat的索引和列检查的开销)。

pd.DataFrame(
    np.concatenate([df.values for df in dfs], axis=1),   
    index=dfs[0].index, 
    columns=[col for df in dfs for col in df]
)

在检查此方法与concat的时序后,使用随机数据时它们非常相似。对于如此大的数据框,您可能需要考虑其他解决方案,例如Dask

答案 1 :(得分:1)

似乎true/falsegenerator的工作速度更快。

请注意,此代码需要大量RAM,因此最好分别运行两个版本。

transposing