由于它完全被误认为是在此处编辑所选答案。以下内容说明了为什么不 应该 使用放大设置。 “放大设置”实际上比追加效果差。
该 TL;博士 在这里是 有一个数据帧要做到这一点没有有效的方法,所以如果你需要的速度,你应该使用另一种数据结构来代替。
查看其他答案以获得更好的解决方案。
您可以使用
loc不存在的索引就地向Dataframe添加行,但是这也会执行所有数据的副本(请参见本讨论)。从Pandas文档中可以看到以下内容:
In [119]: dfiOut[119]: A B C0 0 1 01 2 3 22 4 5 4In [120]: dfi.loc[3] = 5In [121]: dfiOut[121]: A B C0 0 1 01 2 3 22 4 5 43 5 5 5
对于类似上述用例的情况, 设置放大实际上比append
以下 时间长50% :
使用
append(),8000行耗时6.59s(每行0.8ms)
%%timeit df = pd.Dataframe(columns=["A", "B", "C"]); new_row = pd.Series({"A": 4, "B": 4, "C": 4})for i in range(8000): df = df.append(new_row, ignore_index=True)# 6.59 s ± 53.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
使用
.loc(),8000行耗时10s(每行1.25ms)
更长的Dataframe呢?%%timeit df = pd.Dataframe(columns=["A", "B", "C"]); new_row = pd.Series({"A": 4, "B": 4, "C": 4})for i in range(8000): df.loc[i] = new_row# 10.2 s ± 148 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
与所有面向数据的代码中的概要分析一样,YMMV也应针对您的用例进行测试。
append和“设置放大”的写时复制行为的一个特征是,随着
Dataframes的增大,写入速度会越来越慢:
%%timeit df = pd.Dataframe(columns=["A", "B", "C"]); new_row = pd.Series({"A": 4, "B": 4, "C": 4})for i in range(16000): df.loc[i] = new_row# 23.7 s ± 286 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Dataframe用这种方法建立一个16k的行比8k的行花费2.3倍的时间。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)