插值仍然留下 NaN 值(pandas groupby)

3

我有一个数据框,其中包含一些客户的位置信息(因此我有一个包含客户ID的列以及其他包含纬度和经度的列),我正在尝试根据每个客户对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。这是我使用的代码 如果行的索引不存在于另一个数据框中,则用NaN替换数据框中的某些值 我认为问题不在这里,但由于我很困惑实际问题出在哪里,所以我将它放在这里)

1
抱歉,我会在问题中更改。我将其设置为变量,以便每次运行时更容易在管道中更改。但它被设置为最近的。 - Nocas
1个回答

4
当使用nearest进行插值时,只能填充缺少值之间的空隙。 (您会注意到,在只有1个非空值的情况下(例如您的示例),会出现错误)。其余的空值是“边缘”,需要用.bfill().ffill()进行处理。这也是使用仅一个非缺失值进行“插值”的适当逻辑。
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

这只适用于最近的方法吗?立方体也让我感到困扰,我是否应该尝试使用类似的方法来解决它? - Nocas
通常插值用于填充中间的值。外部值需要进行外推,这通常是通过曲线拟合来完成的。 - ALollz
@Nocas 请查看 https://dev59.com/vmEh5IYBdhLWcg3wYSc2 - ALollz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接