通过索引

时间:2017-05-21 09:46:47

标签: python pandas dataframe insert

我正在使用Python并在pandas数据框中拥有一个大型数据集。我已经将这些数据的一部分放入另一个数据框中,在那里我创建了一个新列并填充了它。我现在想把这个新列重新放回到原始数据框中,覆盖其中一个现有列,但仅限于我编辑过的部分。

请帮助建议如何做得最好?唯一唯一标识符是自动生成的索引。第二个数据框保持了与较大的索引值相同的索引值,所以它应该是非常直接但我无法弄清楚如何 a)引用自动创建的索引 b)使用这些索引覆盖来自另一个数据帧的列中的现有数据

所以,它应该是这样的(我意识到这是一个语法的混搭,但只是想更好地解释我想要做的事情!):

where df1.ROW.INDEX == df2.ROW.INDEX insert into 
df1['col_name'].value from df2.['col_name'].value

非常感谢任何帮助。

更新的: 我现在有这个代码几乎可以工作:

index_values = edited_df.index.values
for i in index_values:
    main_df.iloc[i]['pop'] = 
    edited_df.iloc[i]['new_col']

我收到了警告错误,并且main_df没有更改。它看起来像是在每次迭代中制作副本而不是更新主数据帧。

更新:已修复 我终于设法解决了下面针对遇到类似问题的人的问题。

index_values = edited_df.index.values
for i in index_values:
    main_df.iloc[i, main_df.columns.get_loc('pop')] = 
    edited_df.iloc[i]['new_col'] 

2 个答案:

答案 0 :(得分:1)

考虑使用pandas.DataFrame.update来传入数据帧中的内部更新。确保列名称与两个数据集都匹配。

main_df.update(edited_df, join='left', overwrite=True)

答案 1 :(得分:1)

我感谢你找到了一个有效的解决方案。但是,当您不需要时,您正在使用for循环。我将从改善你的循环开始。然后我将备份@ Partfait的update想法

使用loc按索引和列值引用。你依赖于你的索引值是有序整数的巧合。

index_values = edited_df.index.values
for i in index_values:
    main_df.loc[i, 'pop'] = edited_df.loc[i, 'new_col'] 

但是,loc可以像索引器一样使用数组,而您只使用标量索引器。这意味着您最好使用at

index_values = edited_df.index.values
for i in index_values:
    main_df.at[i, 'pop'] = edited_df.at[i, 'new_col'] 

或者你可以使用set_value

更快
index_values = edited_df.index.values
for i in index_values:
    main_df.set_value(i, 'pop', edited_df.get_value(i, 'new_col'))

所有这些都说明了,您可以一次性使用loc

main_df.loc[:, 'pop'] = edited_df['new_col']

或者@Partfait建议

main_df.update(edited_df['new_col'].rename('pop'))