Я хочу вычислить среднее по строкам столбцов y_2010, y_2011, y_2012, y_2013, y_2014 фрейма данных (данные об использовании энергии за год), однако:
- значения, которые отличаются более чем 20% от медианы (из пяти значений) должны быть исключены из вычисления среднего.
- если остается менее двух значений в каждой строке (после условия выше), для среднего устанавливается значение NaN как одно value недостаточно, чтобы иметь надежное среднее значение ->, поэтому среднее значение может быть вычислено только для строк, содержащих два или более значений после «условия разницы 20%» выше. (см. ID (36): одно значение остается после первого условия, но этого недостаточно для надежного среднего значения, поэтому оно установлено на NaN)
Вычислить среднее значение 5 столбцов легко, но я «Я застрял при определении условий», если медиана * 0,8 <= одно из значений в строке данных <= медиана * 1,2, то среднее == среднее значение в пределах границы и 2 или более значений присутствуют. </p>
Итак, я пытаюсь вычислить среднее значение только для строк данных без «выбросов».
Начальный df:
ID y_2010 y_2011 y_2012 y_2013 y_2014
23 22631 21954.0 22314.0 22032 21843
43 27456 29654.0 28159.0 28654 2000
36 61200 NaN NaN 31895 1600
87 87621 86542.0 87542.0 88456 86961
90 58951 57486.0 2000.0 0 0
98 24587 25478.0 NaN 24896 25461
Желаемый df:
ID y_2010 y_2011 y_2012 y_2013 y_2014 mean
0 23 22631 21954.0 22314.0 22032 21843 22154.8
1 43 27456 29654.0 28159.0 28654 2000 28480.75
2 36 61200 NaN NaN 31895 1600 NaN
3 87 87621 86542.0 87542.0 88456 86961 87424.4
4 90 58951 57486.0 2000.0 0 0 NaN
5 98 24587 25478.0 NaN 24896 25461 25105.5
Пробовал код до сих пор (я застрял в правильных условиях и применяю их к фрейму данных):
import pandas as pd
import numpy as np
df = pd.DataFrame({"ID": [23,43,36,87,90,98],
"y_2010": [22631,27456,61200,87621,58951,24587],
"y_2011": [21954,29654,np.nan,86542,57486,25478],
"y_2012": [22314,28159,np.nan,87542,2000,np.nan],
"y_2013": [22032,28654,31895,88456,0,24896,],
"y_2014": [21843,2000,1600,86961,0,25461]})
print(df)
a = df.loc[:, ['y_2010','y_2011','y_2012','y_2013', 'y_2014']]
# calculate median
median = a.median(1)
print(median)
# where condition is violated
mask = a.lt(median*.8, axis=0) | a.gt(median*1.2, axis=0)