熊猫,用MultiIndex DataFrame中的值替换NaN

时间:2019-02-07 17:00:18

标签: python pandas dataframe imputation

问题

我有一个带有某些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

想法

我找到的最近的帖子是关于filling NaNs with values from one level of a multiindex

我也尝试过使用列dfindex1然后使用index2df.fillna的索引设置为多索引,但是这不起作用。 / p>

1 个答案:

答案 0 :(得分:1)

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