熊猫在循环中向df添加行

时间:2018-08-21 20:28:40

标签: python pandas dataframe

我正在循环解析数据,一旦对其进行了解析和结构化,我想将其添加到数据帧中。

我想要的数据帧的结束格式如下:

df:

id   2018-01 2018-02 2018-03  
234     2       1       3
345     4       5       1
534     5       3       4
234     2       2       3

当我遍历循环中的数据时,我有一个字典,其中包含id,月份和月份值,例如:

{'id':234,'2018-01':2}
{'id':534,'2018-01':5}
{'id':534,'2018-03':4}
           .
           .
           .

获取空数据框并向其循环添加行和列及其值的最佳方法是什么?

基本上,在我进行迭代时,它看起来像这样

df:

id   2018-01   
234     2       

然后

df:

id   2018-01   
234     2  
534     5

然后

df:

id   2018-01   2018-03
234     2  
534     5         4

以此类推...

3 个答案:

答案 0 :(得分:0)

IIUC,您需要首先将单个字典转换为数据帧,然后执行append,如果我们没有重复的'id',则需要groupby获得{{1} }值

first

答案 1 :(得分:0)

不建议在每次迭代时都生成一个新的数据帧并将其追加,这非常昂贵。如果您的数据不太大且无法容纳到内存中,则可以先列出字典,然后用pandas进行操作:

df = pd.DataFrame(your_list_of_dicts)
df.set_index('id')

如果创建列表非常昂贵(因为您想为数据框节省内存),请考虑使用生成器而不是列表。生成器功能的基本结构是:

def datagen(your_input):
    for item in your_input:
        # your code to make a dict
        yield dict

生成器对象data = datagen(input)将不存储字典,但会在每次迭代时生成一个字典。它可以按需生成项目。当您执行pd.DataFrame(data)时,熊猫将流式传输所有数据并构成一个数据帧。生成器可用于数据管道(如UNIX中的管道),并且对于大数据工作流非常强大。但是请注意,生成器对象只能使用一次,也就是说,如果再次运行pd.DataFrame(data),则会得到一个空的数据帧。

答案 2 :(得分:0)

我在 Pandas 中找到的将新数据行迭代地附加到数据帧的最简单方法(虽然不直观)是使用 df.loc[ ] 来引用最后(不存在的)行,使用 len(df) 作为索引:

df.loc[ len(df) ] = [new, row, of, data]

这会将新数据行就地“追加”到数据帧的末尾。

上面的例子是一个正好有 4 列的空 Dataframe,例如:

df = pandas.DataFrame(  columns=["col1", "col2", "col3", "col4"]  )

df.loc[ ] 索引可以在任何行插入数据,无论它是否存在。似乎它永远不会给出 IndexError,就像 numpy.arrayList 如果您试图分配给不存在的行一样。 对于全新的空 DataFrame,len(df) 返回 0,因此引用第一个空白行,然后每次添加一行时增加一。

–––––

我不知道这种方法的速度/内存效率成本,但它适用于我适度的数据集(几千行)。至少从内存的角度来看,我认为将数据直接附加到目标 DataFrame 的大循环将比首先生成重复数据的中间列表,然后从该列表生成 DataFrame 使用更少的内存。时间“效率”可能是一个完全不同的问题,其他 SO 专家可以评论。

–––––

但是,对于 OP 的特定情况,如果数据用于现有的同名列,您请求组合 columns,则在 {{ 1}} 循环。

相反,我会将 DataFrame 设为“哑巴”并按原样导入数据,并在日期到来时重复它们,例如。你的循环后数据帧看起来像这样,用简单的列名描述原始数据:

for

(同一日期有两个条目)。

然后我将使用 DataFrame 的数据库函数来组织您喜欢的数据,可能使用 df: id date data 234 2018-01 2 534 2018-01 5 535 2018-03 4 df.unique() 的某种组合。稍后会详细研究。

相关问题