从这个问题和其他问题来看,似乎不建议使用concat
或append
来构建熊猫数据帧,因为每次都会重新复制整个数据帧。
我的项目涉及每30秒检索少量数据。这可能会运行3天的周末,因此有人很容易期望一次创建一行超过8000行。向该数据帧添加行的最有效方法是什么?
汤姆·哈维的反应很好。不过,我想补充一个基于熊猫的更简单的答案。DataFrame.from_dict。
通过将列表中一行的数据添加到字典中,然后将此列表添加到字典中,您可以使用pd。DataFrame.from_dict,无需迭代即可创建数据帧。
如果字典的每个值都是一行。您可以只使用:
pd。数据帧。来自dict(字典,orient='index')
小例子:
# Dictionary containing the data
dic = {'row_1':['some','test','values',78,90],'row_2':['some','test','values',100,589]}
# Creation of the dataframe
df = pd.DataFrame.from_dict(dic,orient='index')
df
0 1 2 3 4
row_1 some test values 78 90
row_2 some test values 100 589
编辑选择的答案,因为它是完全错误的。下面解释了为什么不应使用放大设置。“放大设置”实际上比追加更糟糕。
tl;这里的dr是,没有有效的方法来处理数据帧,所以如果您需要速度,您应该使用另一种数据结构。请参阅其他答案以获得更好的解决方案。
您可以使用不存在索引上的loc
将行添加到就地DataFrame,但这也执行所有数据的副本(请参阅本讨论)。熊猫留档是这样的:
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
花费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行需要10秒(每行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)
使用此方法构建16k行数据帧需要比8k行长2.3倍的时间。
我用了这个答案的df。loc[i]=[新数据]
建议,但我有
from io import BytesIO
from csv import writer
import pandas as pd
output = BytesIO()
csv_writer = writer(output)
for row in iterable_object:
csv_writer.writerow(row)
output.seek(0) # we need to get back to the start of the BytesIO
df = pd.read_csv(output)
return df
这样,大约500000行的速度提高了1000倍,随着行数的增加,速度的提高只会越来越大(df.loc[1]=[data]
相对来说会慢得多)
希望这能帮助那些在处理比OP更多的行时需要效率的人。
问题内容: 从这个问题和其他问题来看,似乎不建议使用或构建熊猫数据框,因为它每次都在重新复制整个数据框。 我的项目涉及每30秒检索少量数据。这可能需要进行为期3天的周末,所以有人可以轻松地期望一次创建超过8000行。将行添加到此数据框的最有效方法是什么? 问题答案: 由于它完全被误认为是在此处编辑所选答案。以下内容说明了为什么不 应该 使用放大设置。 “放大设置”实际上比追加效果差。 该 TL;博
我正在使用Pandas,希望将行添加到已建立列的空数据框中。 到目前为止,我的代码看起来像这样。。。 然而,当我跑步的时候。。。 数据框返回时没有行,只有列。我不确定我做错了什么,但我很确定它与append方法有关。有人知道我做错了什么吗?
问题内容: 如果我有一个空的数据框: 有没有一种方法可以向此新创建的数据框添加新行?目前,我必须创建一个字典,将其填充,然后将字典附加到最后的数据框中。有没有更直接的方法? 问题答案: 即将发布的pandas 0.13版本将允许通过不存在的索引数据添加行。但是,请注意,这实际上会创建整个DataFrame的副本,因此这不是有效的操作。 说明在此处,此新功能称为“ 放大设置” 。
问题内容: 我有一个数据框看起来像这样: 对于YEAR值,我想在原始数据帧中添加year列(1993,1994 …,2009)。如果YEAR中的值为1992,则1992列中的值应为1,否则为0。 我使用了一个非常愚蠢的for循环,但是由于我拥有大量数据集,它似乎可以永远运行。谁能帮助我,非常感谢! 问题答案: 如果您想删除该列,则可以通过进行后续操作。或者,在调用之前从中删除列:
假设我有一个空的dataframe,已经设置了列,但没有行。我从网上搜集了一些数据,所以假设我需要向空数据帧添加一个索引< code>'2176'。当我试图分配该行时,如何自动将它添加到数据库中?这是熊猫的目的还是我应该用别的东西?
本文向大家介绍Python pandas如何向excel添加数据,包括了Python pandas如何向excel添加数据的使用技巧和注意事项,需要的朋友参考一下 pandas读取、写入csv数据非常方便,但是有时希望通过excel画个简单的图表看一下数据质量、变化趋势并保存,这时候csv格式的数据就略显不便,因此尝试直接将数据写入excel文件。 pandas可以写入一个或者工作簿,两种方法介绍