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
部分。
答案 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/false
和generator
的工作速度更快。
请注意,此代码需要大量RAM,因此最好分别运行两个版本。
transposing