Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas,将NaN替换为多索引数据帧中的值_Python_Pandas_Dataframe_Imputation - Fatal编程技术网

Python Pandas,将NaN替换为多索引数据帧中的值

Python Pandas,将NaN替换为多索引数据帧中的值,python,pandas,dataframe,imputation,Python,Pandas,Dataframe,Imputation,问题 我有一个带有一些NAN的数据帧,我试图根据另一个数据帧的值智能地填充这些NAN。我还没有找到一种有效的方法来做到这一点,但我怀疑有一种方法可以对付熊猫 最小示例 起始数据df: 查找表以查找要填充NAN的值: fill_vals 1 a 89 b 91 2 a 99 b 101 期望输出: data index1 index2 0 89 1 a 1 90 1

问题

我有一个带有一些NAN的数据帧,我试图根据另一个数据帧的值智能地填充这些NAN。我还没有找到一种有效的方法来做到这一点,但我怀疑有一种方法可以对付熊猫

最小示例

起始数据df:

查找表以查找要填充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
想法

我找到的最近的帖子是关于

我还尝试使用index1和index2列将df的索引设置为多索引,然后使用df.fillna,但是这不起作用。

combine\u 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
  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
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