根据另一个数据框中的列在一个数据框中填充空值?

时间:2020-10-14 22:08:13

标签: python pandas

我有第一个数据框,该数据框在列中包含一些缺失值。然后,我有了第二个数据框,其中包括一个更完整的数据集,但不一定具有相同的精确索引。例如,这是情况的描述:

enter image description here

很明显,填充匹配的索引很容易(例如,可以使用第二个数据帧中的634填充第一个nan)。对于不在另一个DF中的索引,我想在两个最接近的值之间进行插值(例如,要填充5.0,我想在df2中的4.8和5.2之间进行插值)。我不确定如何做到这一点,至少不是以熊猫的方式。我的直觉是遍历缺少的值,在df2中手动找到最接近的索引,然后在它们之间进行插值。我敢肯定,有解决这个问题的更聪明的方法。有提示吗?

1 个答案:

答案 0 :(得分:1)

为了避免混淆,我更改了列名Index-> arg

首先加载数据帧

df1 = pd.DataFrame({
    'arg': {0: 1.0, 1: 2.3, 2: 2.5, 3: 3.6, 4: 5.0, 5: 5.9, 6: 6.0, 7: 6.2, 8: 6.3, 9: 6.4},
    'value': {0: 634.0, 1: 500.0, 2: 439.0, 3: 287.0, 4: 641.0, 5: 212.0, 6: 374.0, 7: 358.0, 8: 600.0, 9: 755.0}
}) 
df2 = pd.DataFrame({
    'arg': {0: 1.0, 1: 1.4, 2: 1.8, 3: 2.2, 4: 2.4, 5: 2.8, 6: 3.2, 7: 3.6, 8: 4.0, 9: 4.4, 10: 4.8, 11: 5.2, 12: 5.6, 13: 6.0, 14: 6.4},
    'value': {0: 634, 1: 8, 2: 218, 3: 813, 4: 338, 5: 339, 6: 935, 7: 287, 8: 376, 9: 481, 10: 727, 11: 555, 12: 50, 13: 374, 14: 755}
})

计算df1上的左连接,并将值从df1更新为df2。

temp = df1.merge(df2, on="arg", how="left")
df1["value"] = temp.value_y.combine_first(temp.value_x)

获取静止的NaN值

to_interpolate = df1[df1.value.isna()]

将不带值的参数添加到df2并内插值。

df3 = pd.concat([to_interpolate, df2]).sort_values("arg")
df3.value.interpolate(inplace=True)

重复合并。

temp = df1.merge(df3, on="arg", how="left")
df1["value"] = temp.value_x.combine_first(temp.value_y)
print(df1)

输出:

   arg  value
0  1.0  634.0
1  2.3  500.0
2  2.5  439.0
3  3.6  287.0
4  5.0  641.0
5  5.9  212.0
6  6.0  374.0
7  6.2  358.0
8  6.3  600.0
9  6.4  755.0