当前位置: 首页 > 知识库问答 >
问题:

Python-向数据框添加行的有效方法

锺离声
2023-03-14

从这个问题和其他问题来看,似乎不建议使用concatappend来构建熊猫数据帧,因为每次都会重新复制整个数据帧。

我的项目涉及每30秒检索少量数据。这可能会运行3天的周末,因此有人很容易期望一次创建一行超过8000行。向该数据帧添加行的最有效方法是什么?

共有3个答案

相诚
2023-03-14

汤姆·哈维的反应很好。不过,我想补充一个基于熊猫的更简单的答案。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

邢凯歌
2023-03-14

编辑选择的答案,因为它是完全错误的。下面解释了为什么不应使用放大设置。“放大设置”实际上比追加更糟糕。

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和"使用放大设置"的写时复制行为的一个特点是,它将越来越慢与大的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)

使用此方法构建16k行数据帧需要比8k行长2.3倍的时间。

冉德元
2023-03-14

我用了这个答案的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可以写入一个或者工作簿,两种方法介绍