我有第一个数据框,该数据框在列中包含一些缺失值。然后,我有了第二个数据框,其中包括一个更完整的数据集,但不一定具有相同的精确索引。例如,这是情况的描述:
很明显,填充匹配的索引很容易(例如,可以使用第二个数据帧中的634填充第一个nan)。对于不在另一个DF中的索引,我想在两个最接近的值之间进行插值(例如,要填充5.0,我想在df2中的4.8和5.2之间进行插值)。我不确定如何做到这一点,至少不是以熊猫的方式。我的直觉是遍历缺少的值,在df2中手动找到最接近的索引,然后在它们之间进行插值。我敢肯定,有解决这个问题的更聪明的方法。有提示吗?
答案 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