大熊猫,从多指标数据框中的值替换的NaN

问题描述 投票:0回答:1

问题

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

我也试着设置df的指标是使用index1index2,然后使用df.fillna列的多指标,然而,这是行不通的。

python pandas dataframe imputation
1个回答
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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.