2017-05-21 59 views
1

我使用Python並在熊貓數據框中有一個大型數據集。我已將這些數據的一部分放入另一個數據框中,在那裏我創建了一個新列並填充它。我現在想把這個新的列放回到原來的數據框中,覆蓋其中一個現有的列,但僅限於我編輯過的部分。通過索引將數據從一個數據框插入另一個數據框

請你幫忙建議這是如何做到最好?唯一的唯一標識符是自動生成的索引。第二個數據幀保持與較大值相同的索引值,所以它應該非常直接,但我不能解決如何a)引用自動創建的索引 b)使用這些索引覆蓋列中的現有數據另據幀

所以,它應該是這樣的(我意識到這是語法的混搭,但只是想更好地解釋什麼,我試圖做的!):

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

任何幫助將是很大的讚賞。

UPDATE: 我現在有這樣的代碼幾乎工作:

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'] 

回答

1

考慮使用pandas.DataFrame.update從傳入的數據幀進行就地更新。確保列名與兩個數據集匹配。

main_df.update(edited_df, join='left', overwrite=True) 
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')) 
相關問題