据我了解,pandas 旨在加载完全填充的 DataFrame,但我需要创建空的 DataFrame,然后添加行,一个一个地若要执行此操作的最佳方法是什么?

我成功地创建具有空 DataFrame:

res = DataFrame(columns=('lib', 'qty1', 'qty2'))

然后我可以添加一个新行并填充的字段︰

res = res.set_value(len(res), 'qty1', 10.0)

它的工作方式,但:-/ 看起来非常奇怪(失败添加字符串值)

如何添加一个新行到我 DataFrame (使用不同的列类型)?

2012-05-23 08:12:31
问题评论:

请注意这是非常低效的办法构建大型的 DataFrame;新阵列必须创建 (复制现有的数据) 时将追加行。

@WesMcKinney: thx,这确实很有必要知道。是很快就能大表中添加

如果您太低,可能会预分配额外的行,然后更新该。

回答:

在 @Nasser 的答案的示例︰

>>> df = DataFrame(columns=('lib', 'qty1', 'qty2'))
>>> for i in range(5):
>>>     df.loc[i] = [randint(-1,1) for n in range(3)]
>>>
>>> print(df)
    lib  qty1  qty2
0    0     0    -1
1   -1    -1     1
2    1    -1     1
3    0     0     0
4    1    -1    -1

[5 rows x 3 columns]

考虑添加索引以预分配内存 (请参阅我的答案)

在 pandas 0.11.0 无效

@MaximG︰ 我强烈建议升级。当前的 Pandas 版本是 0.15.0。

.loc引用索引列中,以便.loc如果您正在处理具有不连续序列起始值为 0 (如您的示例中) 的整数的索引已存在 DataFrame,将覆盖现有的行,或插入行,或索引中产生间隙。为了执行追加操作现有的非零长度 dataframe 一更强大 (但不是可靠一点) 的方法是︰ df.loc[df.index.max() + 1] = [randint(...或 @FooBar 建议作为预设索引。

@hobs︰ 我完全同意您的。感谢您的输入。但是,它是从建议中的原始问题的不同方案。如果您知道,推理,数据帧的大小则肯定更快地分配内存。

您可以使用pandas.concat()DataFrame.append()有关详细信息和示例,请参阅合并,加入,并将相连接.

谢谢 !它的工作。我将编辑要包括完整的回答的问题。

大家好,所以解决办法是使用 append() 或 concat () 的方法。我有同样的问题,但仍试着找出。

为什么这是无法接受的答案?必须滚动一直在此处查找的评价最高的答案?

@thias,这是其中一个 eternal 问题的现代生活中,以及"什么是迈克尔 • 柳荫真的愿意吗?"

添加了示例。

您可以创建一个列表的字典。其中每个词典列表中的对应于输入的数据行。这些行被添加到主列表中的 for 循环。一旦完成列表,然后创建一个数据帧。这是一种更快方法。

我有一个类似的问题,如果创建的每一行的数据帧,并将其添加到主数据帧花 30 分钟。另一方面,如果使用下面的方法,我已成功在几秒钟内。

rows_list = []
for row in input_rows:

        dict1 = {}
        # get input row in dictionary format
        # key = col_name
        dict1.update(blah..) 

        rows_list.append(dict1)

df = pd.DataFrame(rows_list)               

已经调到执行此操作也适用于任何情况,不能从哪里获得的所有数据提前。速度差异是惊人的。

速度差异是确实惊人

从 pandas 文档复制︰It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.(pandas.pydata.org/pandas-docs/stable/...)

如果您知道 ex ante 的项数,您应提供索引 (将数据取自不同答案) 预分配空间︰

import pandas as pd
import numpy as np
# we know we're gonna have 5 rows of data
numberOfRows = 5
# create dataframe
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') )

# now fill it up row by row
for x in np.arange(0, numberOfRows):
    #loc or iloc both work here since the index is natural numbers
    df.loc[x] = [np.random.randint(-1,1) for n in range(3)]
In[23]: df
Out[23]: 
   lib  qty1  qty2
0   -1    -1    -1
1    0     0     0
2   -1     0    -1
3    0    -1     0
4   -1     0     0

速度比较

In[30]: %timeit tryThis() # function wrapper for this answer
In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred)
1000 loops, best of 3: 1.23 ms per loop
100 loops, best of 3: 2.31 ms per loop

和-从注释的大小为 6000、 速度差异变得更大︰

增加大小的数组 (12) 和行 (500) 数使速度差别更多达成︰ 313ms年与 2.29s年

答得好。这样行空间不需要增量分配,这应该是司空见惯的现象。

增加大小的 array(12) 和 rows(500) 的数目使速度差别更多达成︰ 313ms年与 2.29s年

mycolumns = ['A', 'B']
df = pd.DataFrame(columns=mycolumns)
rows = [[1,2],[3,4],[5,6]]
for row in rows:
    df.loc[len(df)] = row

这 !我已经进行了搜索相当一段时间,而这是真正显示了如何将特定值分配给行的第一篇 !奖金的问题︰ 它是列的名称/值对的语法?我想它必须使用双向词典,但是我好像不能获得成功。

内容来源于Stack Overflow add one row in a pandas.DataFrame
请输入您的翻译

add one row in a pandas.DataFrame

确认取消