使用以下“掩碼”資料幀:
>>> mask
city value_1 value_2
index
0 London 10 NaN
1 Paris NaN 21
2 Paris 30 NaN
3 Paris NaN NaN
4 Berlin 3 5
5 Berlin NaN 10
6 New York NaN NaN
以及以下“填充”框架:
>>> filling
value_1 value_2
London 1100 2100
Paris 1150 2200
Berlin NaN 3000
New York 5000 NaN
如何合并filling成mask基礎city和列,這樣得到的資料框變為:
>>> result
city value_1 value_2
index
0 London 10 2100
1 Paris 1150 21
2 Paris 30 2200
3 Paris 1150 2200
4 Berlin 3 5
5 Berlin NaN 10
6 New York 5000 NaN
從概念上講,從任何值mask即NaN是易于通過該值被“填充”的filling它匹配它的兩個city和它的列(value_1或value_2)。
我正在努力解決的部分是同時DataFrame.merge()考慮索引(此處為city)和所有列。兩者都可以,但要獲得預期的結果,我似乎需要兩者。
編輯:
我嘗試了以下方法:
>>> expanded = mask[[]].join(filling, on='city')
>>> mask.merge(expanded)
但這只會讓我回傳mask,并且所有值expanded都被忽略(即使目標單元格是NaN)。
uj5u.com熱心網友回復:
試著fillna用reindex的filling:
mask.fillna(filling.reindex(mask.city).set_index(mask.index))
輸出:
city value_1 value_2
index
0 London 10.0 2100.0
1 Paris 1150.0 21.0
2 Paris 30.0 2200.0
3 Paris 1150.0 2200.0
4 Berlin 3.0 5.0
5 Berlin NaN 10.0
6 New York 5000.0 NaN
uj5u.com熱心網友回復:
我們可以為此使用DataFrame.updatewith overwrite=False。
注意:我們將方法分開在不同的行中,因為更新就位。
mask = mask.set_index("city")
mask.update(filling, overwrite=False)
mask = mask.reset_index()
city value_1 value_2
0 London 10.0 2100.0
1 Paris 1150.0 21.0
2 Paris 30.0 2200.0
3 Paris 1150.0 2200.0
4 Berlin 3.0 5.0
5 Berlin NaN 10.0
6 New York 5000.0 NaN
uj5u.com熱心網友回復:
您還可以使用combine_first專為此目的而設計的:
print (mask.set_index("city").combine_first(filling))
value_1 value_2
Berlin 3.0 5.0
Berlin NaN 10.0
London 10.0 2100.0
New York 5000.0 NaN
Paris 1150.0 21.0
Paris 30.0 2200.0
Paris 1150.0 2200.0
如果您需要保留原始順序,reset_index請先進行排序,然后再對其進行排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/340514.html
上一篇:對熊貓中一列中的所有元素求和
下一篇:如何將水平線添加到熊貓df圖中?
