2017-06-01 58 views
1

我有兩個數據幀具有相同的列。第二列是第一列的索引值的子集,但其中一些列的空字段和其他列的更新信息。檢查一個大熊貓數據幀的元素更新另一個

例子:

DFA:

  Height Weight Age Street PhoneNumber 

Pete  5.2  130  33 Pine 123-456-7890 
Mary  5.0  110  34 Main 434-444-5555 
Rob  6.0  230  44 Maple 999-444-2222 
.... 

DFB:

 Height Weight Age Street PhoneNumber 

Pete  Nan  125  Nan Arbor  Nan 
Rob  Nan  235  45  Nan 776-333-3222 

我想在dfb新的信息來更新字段dfa。如果沒有更新dfb(該字段是Nan),我想保留原始值dfa

我能想到做到這一點的唯一方法是通過行和列進行迭代,找到dfb的元素,然後在dfa等於dfb地址設置相應的地址。醜陋。

是否有更乾淨(更pythonic)的方式來做到這一點?

在此先感謝。

編輯:爲清晰起見,更改了dfb。這兩個dfs沒有相同的索引。 dfb是dfa的一個子集。

回答

5

你需要的是combine_first確保那些 「南」 是真正第一np.nan:

dfb = dfb.replace('Nan',np.nan) 
dfb.combine_first(dfa) 

輸出:

 Height Weight Age Street PhoneNumber 
Pete  5.2 125 33 Arbor 123-456-7890 
Mary  5.0 110 34 Main 434-444-5555 
Rob  6.0 235 45 Maple 776-333-3222 
+0

有趣。文件說'a的值優先使用b來填補漏洞'。我還沒有測試過,但是如果我正確理解使用了a的值(即使爲空),但是如果存在來自b的非空值(其中index.a = = index.b),則會被替換。是對的嗎? – Windstorm1981

+0

輸出來自'dfb'。然後您需要將其重新分配給'dfa',或者之後將'dfb'用作完成的數據幀。我相信'更新'是一個更乾淨的解決方案。 – Alexander

+0

如果您想放棄原始數據框中的更改跟蹤,請選擇清理程序。我認爲如果您給用戶選擇重新分配或創建新的dfc會更安全,因此如果需要的話,他們可以返回原始數據框。 –

1

如果DFB的指標是一樣的DFA,也許使用一些面具,像

mask = dfb.notnull() 
dfa[mask] = dfb[mask] 
+0

不幸的是,索引是不一樣的。 dfb.index是dfa.index – Windstorm1981

+0

的一個子集顯然(我做了檢查),即使dfb索引和列是dfa的一個子集,它也可以工作,無論如何,我發現其他解決方案更合適 –

+0

謝謝。我完全不熟悉口罩。我將不得不閱讀以瞭解如何申請。帶有掩碼的概念只需在一個對象中「分組識別」值,以便將它們應用於第二個相同(或幾乎相同)的對象? – Windstorm1981

1

你在找什麼是fillna(),帶走OOK這裏 link

你的情況只是在做 dfb.fillna(dfa)

應該工作

+0

很酷。我不知道你可以像這樣在數據框級別上使用fillna()。但請看我的編輯。 dfb實際上是dfa觀察的一個子集。因此,如果我做了'dfb.fillna(dfa)',我會失去'dfa'中不在'dfb'中的所有行。你的建議可能有用嗎? – Windstorm1981

+0

至少在我做的測試中它是一樣的,否則combine_first()看起來非常有吸引力 – gionni

+0

'fillna'只是用'dfb'的值更新'dfa'中的NaN值。 OP要求'dfb'中的所有非空值用於更新'dfa'。 – Alexander

1

你只是想update原來的數據幀:

dfa.update(dfb) 

>>> dfa 

     Height Weight Age Street PhoneNumber 
Pete 5.2  125  33 Arbor 123-456-7890 
Mary 5.0  110  34 Main 434-444-5555 
Rob  6.0  235  45 Maple 776-333-3222 

update使用非NA修改原始數據幀中的目的地從值第二個數據幀。