Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как заполнить нужные строки средними средним арифметическим соседних двух строк?

#python #pandas #dataframe #numpy


Есть ДатаФрейм - таймсерия. Кое-какие значения в дата фрейме отсутствуют, а на их
месте стоит '.'

Я хочу заменить все значения с '.' на среднее апрфметическое двух соседних значений
 колонки

Возможен так же вариант, что два или ти соседние значения принимают '.'. Т. е. для
исчисления показателей надо брать не соседние, а соседние значения, которые не ровняются '.'
Подскажите пжл как это сделать

Пример входных данных: 

DJIA

3

.

5

6


Пример выходных данных:

DJIA

3

4

5

6


где 4 = (3+5)/2

Пробую вот так:

for i in data['DJIA']:
    if i == '.':
        data['DJIA'][i] = (data['DJIA'][i-1] + data['DJIA'][i+1])/2


Здесь ошибка очевидна: 

TypeError                                 Traceback (most recent call last)
 in 
      1 for i in data['DJIA']:
      2     if i == '.':
----> 3         data['DJIA'][i] = (data['DJIA'][i-1] + data['DJIA'][i+1])/2

TypeError: unsupported operand type(s) for -: 'str' and 'int'


Как правильно реализовать этот функционал?
    


Ответы

Ответ 1



Воспользуйтесь методом Series.interpolate(): data = pd.read_csv(r"D:\download\DJIA.csv", na_values=["."], parse_dates=["DATE"]) data["DJIA"] = data["DJIA"].interpolate() Пример для данных из вашего предыдущего вопроса: In [18]: data.loc[110:130] Out[18]: DATE DJIA 110 2009-12-24 10520.10 111 2009-12-25 NaN 112 2009-12-28 10547.08 113 2009-12-29 10545.41 114 2009-12-30 10548.51 115 2009-12-31 10428.05 116 2010-01-01 NaN 117 2010-01-04 10583.96 118 2010-01-05 10572.02 119 2010-01-06 10573.68 120 2010-01-07 10606.86 121 2010-01-08 10618.19 122 2010-01-11 10663.99 123 2010-01-12 10627.26 124 2010-01-13 10680.77 125 2010-01-14 10710.55 126 2010-01-15 10609.65 127 2010-01-18 NaN 128 2010-01-19 10725.43 129 2010-01-20 10603.15 130 2010-01-21 10389.88 In [19]: data["DJIA"] = data["DJIA"].interpolate() In [20]: data.loc[110:130] Out[20]: DATE DJIA 110 2009-12-24 10520.100 111 2009-12-25 10533.590 112 2009-12-28 10547.080 113 2009-12-29 10545.410 114 2009-12-30 10548.510 115 2009-12-31 10428.050 116 2010-01-01 10506.005 117 2010-01-04 10583.960 118 2010-01-05 10572.020 119 2010-01-06 10573.680 120 2010-01-07 10606.860 121 2010-01-08 10618.190 122 2010-01-11 10663.990 123 2010-01-12 10627.260 124 2010-01-13 10680.770 125 2010-01-14 10710.550 126 2010-01-15 10609.650 127 2010-01-18 10667.540 128 2010-01-19 10725.430 129 2010-01-20 10603.150 130 2010-01-21 10389.880

Ответ 2



Если хочется сделать так просто, как то, что приводит к ошибке, то надо немного усложнить другую часть кода for i in range(len(data['DJIA'])): if data['DJIA'][i] == '.': data['DJIA'][i] = (data['DJIA'][i-1] + data['DJIA'][i+1])/2

Комментариев нет:

Отправить комментарий