2016-11-14 4 views
1

Забегая вперед, interpolate отлично работает:Панды интерполировать() в обратном dataframe

 name days 
0  a  NaN 
1  a  NaN 
2  a   2 
3  a   3 
4  a  NaN 
5  a  NaN 

records.loc[:, 'days'].interpolate(method='linear', inplace=True) 

     name days 
0  a  NaN 
1  a  NaN 
2  a   2 
3  a   3 
4  a   4 
5  a   5 

... однако, он не решает начальные строки (только идет вперед). Параметр limit_direction позволяет {‘forward’, ‘backward’, ‘both’}. Ни одна из этих работ не работает. Есть ли подходящий способ интерполяции назад?

Мы можем предположить, что ряд, увеличивающий или уменьшающийся на 1, может не начинаться с 0, как это происходит в этом примере.

+0

Ваш пример * (показаны 6 строк) *, как таковой не будет работать (значения будут оставаться такими же, как и последнее известное значение), поскольку «интерполяция» должна знать первое допустимое значение после «Nan», чтобы экстраполировать эти значения на основе измеряя разницу между строками, значения которых должны быть заполнены. Таким образом, линейная интерполяция лучше всего работает, когда вы указываете ее начальную и конечную точки, чтобы она могла хорошо сглаживать значения «NaN», которые она встречает на середине. –

+0

Текущая версия панд (0.22), похоже, делает трюк с 'limit_direction = 'both''. Начальные и конечные значения «NaN» теперь ** дополняются **. –

ответ

1

Кажется, он работает только с параметром limit см docs [In 47]:

Добавить limit_direction аргумента ключевого слова, которое работает с пределом для включения Interpolate для заполнения NaN значения вперед, назад, или оба (GH9218, GH10420, GH11115)

records = pd.DataFrame(
{'name': {0: 'a', 1: 'a', 2: 'a', 3: 'a', 4: 'a', 5: 'a', 6: 'a', 7: 'a', 8: 'a', 9: 'a'}, 
'days': {0: 0.0, 1: np.nan, 2: np.nan, 3: np.nan, 4: 4.0, 5: 5.0, 6: np.nan, 7: np.nan, 8: np.nan, 9: 9.0}}, 
columns=['name','days']) 

print (records) 
    name days 
0 a 0.0 
1 a NaN 
2 a NaN 
3 a NaN 
4 a 4.0 
5 a 5.0 
6 a NaN 
7 a NaN 
8 a NaN 
9 a 9.0 
#by default limit_direction='forward' 
records['forw'] = records['days'].interpolate(method='linear', 
               limit=1) 
records['backw'] = records['days'].interpolate(method='linear', 
               limit_direction='backward', 
               limit=1) 
records['both'] = records['days'].interpolate(method='linear', 
               limit_direction='both', 
               limit=1) 
print (records) 
    name days forw backw both 
0 a 0.0 0.0 0.0 0.0 
1 a NaN 1.0 NaN 1.0 
2 a NaN NaN NaN NaN 
3 a NaN NaN 3.0 3.0 
4 a 4.0 4.0 4.0 4.0 
5 a 5.0 5.0 5.0 5.0 
6 a NaN 6.0 NaN 6.0 
7 a NaN NaN NaN NaN 
8 a NaN NaN 8.0 8.0 
9 a 9.0 9.0 9.0 9.0 
+0

Можете ли вы получить всю колонку, заполненную линейной последовательностью? –

+0

Как вы думаете, назначить вывод столбцу? – jezrael

+0

Используя приведенный мною пример, первые две записи имели отсутствующие значения. Это создает проблему –

Смежные вопросы