簡體   English   中英

熊貓,用MultiIndex DataFrame中的值替換NaN

[英]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

我還嘗試使用列index1index2然后使用df.fillnadf的索引設置為多索引,但是這不起作用。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM