由于它完全被误认为是在此处编辑所选答案。以下内容说明了为什么不 应该 使用放大设置。
您可以使用loc
不存在的索引就地向DataFrame添加行,但是这也会执行所有数据的副本(请参见本讨论)。从Pandas文档中可以看到以下内容:
In [119]: dfi
Out[119]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
In [120]: dfi.loc[3] = 5
In [121]: dfi
Out[121]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
3 5 5 5
对于类似上述用例的情况, 以下 :
使用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)
%%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
和“设置放大”的写时复制行为的一个特征是,随着DataFrame
s的增大,写入速度会越来越慢:
%%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)