【问题标题】:Interpolation still leaving NaN's (pandas groupby)插值仍然留下 NaN 的 (pandas groupby)
【发布时间】:2019-11-18 08:18:39
【问题描述】:

我有一个数据框,其中包含一些客户的位置(因此我有一个带有 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 我认为问题不在这里,但因为我很困惑问题出在哪里,我就把它留在这里)

【问题讨论】:

  • 对不起,我会在问题中更改它。我将它设置为一个变量,以便每次运行时更容易在管道中进行更改。但它被设置为最近的

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


【解决方案1】:

当您使用 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

【讨论】:

  • 这种情况只适用于最近的方法吗?立方也会给我带来麻烦,我应该尝试用这种方法做类似的事情吗?
  • 通常 interpolate 用于填充两者之间的值。外部值需要您进行推断,这通常通过曲线拟合来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多