插值仍然离开NaN(pandas groupby)

时间:2019-07-08 19:18:47

标签: python python-3.x pandas dataframe interpolation

我有一个带有某些客户位置的数据框(因此我在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,我认为问题不在这里,但是因为我非常对于问题的实际位置感到困惑,我将其留在这里)

1 个答案:

答案 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