Интерполяция все еще оставляет NaN's (панды groupby) - PullRequest
2 голосов
/ 08 июля 2019

У меня есть Dataframe с указанием местоположения некоторых клиентов (поэтому у меня есть столбец с Customer_id и другие с Lat и Lon), и я пытаюсь интерполировать NaN в соответствии с каждым клиентом.

Например, если я интерполирую с ближайшим подходом здесь (я составил значения здесь):

 Customer_id   Lat    Lon
   A            1      1
   A            NaN    NaN  
   A            2      2      
   B            NaN    NaN
   B            4      4

Я бы хотел, чтобы NaN для B было 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 Ответ

3 голосов
/ 08 июля 2019

При интерполяции с 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
...