![](/img/trans.png)
[英]Replace NaNs with values from X rows earlier or later in pandas dataframe
[英]Pandas, replace NaNs with values from MultiIndex DataFrame
問題
我有一個帶有某些NaN的數據框,我試圖根據另一個數據框的值來智能地填充。 我沒有找到一種有效的方法來做到這一點,但我懷疑大熊貓有辦法。
最小的例子
index1 = [1, 1, 1, 2, 2, 2]
index2 = ['a', 'b', 'a', 'b', 'a', 'b']
# dataframe to fillna
df = pd.DataFrame(
np.asarray([[np.nan, 90, 90, 100, 100, np.nan], index1, index2]).T,
columns=['data', 'index1', 'index2']
)
# dataframe to lookup fill values from
multi_index = pd.MultiIndex.from_product([sorted(list(set(index1))), sorted(list(set(index2)))])
fill_val_lookup = pd.DataFrame([89, 91, 99, 101], index=multi_index, columns=
['fill_vals'])
起始數據( df
):
data index1 index2
0 nan 1 a
1 90 1 b
2 90 1 a
3 100 2 b
4 100 2 a
5 nan 2 b
查找表以查找填充NaN的值:
fill_vals
1 a 89
b 91
2 a 99
b 101
所需的輸出:
data index1 index2
0 89 1 a
1 90 1 b
2 90 1 a
3 100 2 b
4 100 2 a
5 101 2 b
思路
我發現的最接近的帖子是用一個多索引級別的值填充NaN 。
我還嘗試使用列index1
和index2
然后使用df.fillna
將df
的索引設置為多索引,但是這不起作用。
combine_first
是您需要的功能。 但是首先,更新另一個數據框的索引名稱。
fill_val_lookup.index.names = ["index1", "index2"]
fill_val_lookup.columns = ["data"]
df.index1 = df.index1.astype(int)
df.data = df.data.astype(float)
df.set_index(["index1","index2"]).combine_first(fill_val_lookup)\
.reset_index()
# index1 index2 data
#0 1 a 89.0
#1 1 a 90.0
#2 1 b 90.0
#3 2 a 100.0
#4 2 b 100.0
#5 2 b 101.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.