вычисление среднего значения кадра данных -> значения, которые отличаются> 20% от медианы, должны быть исключены из вычисления среднего - PullRequest
1 голос
/ 18 июня 2020

Я хочу вычислить среднее по строкам столбцов 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)



1 Ответ

1 голос
/ 18 июня 2020

Думаю, ваша маска правильная, тогда вы можете попробовать это:

col_mean = a[~mask].mean(axis=1)
nan_mask = ~(mask.sum(axis=1) >= 2)

a["mean"] = col_mean.where(nan_mask, other=np.NaN)
print(a)

Вывод:

   y_2010   y_2011  y_2012  y_2013  y_2014  mean
0   22631   21954.0 22314.0 22032   21843   22154.80
1   27456   29654.0 28159.0 28654   2000    28480.75
2   61200   NaN     NaN     31895   1600    NaN
3   87621   86542.0 87542.0 88456   86961   87424.40
4   58951   57486.0 2000.0  0       0       NaN
5   24587   25478.0 NaN     24896   25461   25105.50
...