我有一个带有某些客户位置的数据框(因此我在Customer_id中有一个列,在Lat和Lon中有其他列),我试图根据每个客户对NaN进行插值。
例如,如果我在这里使用最接近的方法进行插值(我在这里补足了值):
Customer_id Lat Lon
A 1 1
A NaN NaN
A 2 2
B NaN NaN
B 4 4
我希望B的NaN为4,而不是2。
我已经尝试过了
series.groupby('Customer_id').apply(lambda group: group.interpolate(method = 'nearest', limit_direction = 'both'))
NaN的数量从9003下降到94。但是我不明白为什么它仍然留下一些缺失的值。
我检查了一下,发现这94个缺失值对应于已被内插的客户记录。例如,
Customer_id Lat
0. A 1
1. A NaN
2. A NaN
3. A NaN
4. A NaN
它将正确插值直到某个值(假设它正确插值1、2和3),然后将4保留为NaN。
我尝试将插值的上限设置为大于每个客户端的最大记录数,但仍无法解决。我不知道我的错误在哪里,有人可以帮忙吗?
(我不知道是否需要提及,但为此我制作了自己的NaN。这是我使用的代码Replace some values in a dataframe with NaN's if the index of the row does not exist in another dataframe,我认为问题不在这里,但是因为我非常对于问题的实际位置感到困惑,我将其留在这里)
答案 0 :(得分:3)
用nearest
进行插值时,它只能填充介于中间的缺失值。 (您会注意到这一点,因为当只有1个非空值时会出现错误,例如您的示例)。其余的空值是“边沿”,.bfill().ffill()
逻辑用nearest
处理。这也是仅用一个非缺失值“插值”的适当逻辑。
def my_interp(x):
if x.notnull().sum() > 1:
return x.interpolate(method='nearest').ffill().bfill()
else:
return x.ffill().bfill()
df.groupby('Customer_id').transform(my_interp)
# Lat Lon
#0 1.0 1.0
#1 1.0 1.0
#2 2.0 2.0
#3 4.0 4.0
#4 4.0 4.0