Есть ли в пандах какой-либо пакет для вычисления среднего значения выбранной части значений столбца на основе других столбцов - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь вычислить среднее значение столбца данных на основе других столбцов, например, у меня есть столбец a, c d, а столбец e содержит значение для среднего значения. если в столбце 'a' 6 строк имеют значение, тогда вычисляют среднее значение для 6 строк в столбце e и дают только одно значение. Затем проверьте столбец c, если они имеют значение, то рассчитайте среднее соответствующее значение, а затем проверьте столбец c и сделайте то же самое.

Я попробовал этот кусок кода, но он не дает желаемых результатов

df['mean']=df['e'].rolling(window=6, min_periods=6).mean()

исходный фрейм данных:

enter image description here

желаемый вывод:

enter image description here

Пример:

df = pd.DataFrame({
         'a':[0] * 6 + [np.nan] * 13,
         'c':[np.nan] * 6 + [400] * 7+ [np.nan] * 6,
         'd':[np.nan] * 13 + [300] * 6,
         'e':[3,4,5,6,8,10,
              3,4,5,6,8,5,5
              ,4,5,6,8,10,11]
})
print (df)
      a      c      d   e
0   0.0    NaN    NaN   3
1   0.0    NaN    NaN   4
2   0.0    NaN    NaN   5
3   0.0    NaN    NaN   6
4   0.0    NaN    NaN   8
5   0.0    NaN    NaN  10
6   NaN  400.0    NaN  3
7   NaN  400.0    NaN  4
8   NaN  400.0    NaN  5
9   NaN  400.0    NaN  6
10  NaN  400.0    NaN  8
11  NaN  400.0    NaN  5
12  NaN  400.0    NaN  5
13  NaN    NaN  300.0   4
14  NaN    NaN  300.0   5
15  NaN    NaN  300.0   6
16  NaN    NaN  300.0   8
17  NaN    NaN  300.0  10
18  NaN    NaN  300.0  11

пожалуйста, проверьте, что среднее значение для первой и второй групп совпадает, поэтому при выводе ваш код будет давать среднее значение для группы сначала для второй, заменить на NAn, но я также хочу, чтобы среднее значение для второй группы было даже таким же

1 Ответ

0 голосов
/ 06 января 2019

Использование:

df = pd.DataFrame({
         'a':[np.nan] * 2 + [0]*4 + [np.nan] * 13,
         'c':[np.nan] * 6 + [400] * 7+ [np.nan] * 6,
         'd':[np.nan] * 13 + [300] * 6,
         'e':[3,4,5,6,8,10,
              11,54,56,46,95,89,45
              ,4,5,6,8,10,11]
})
#print (df)

df1 = df[['a','c','d']]
s = df1.ffill(axis=1).iloc[:, -1].fillna(-1)
#create groups by consecutive values
m = s.ne(s.shift()).cumsum()

#get means per groups with transform and set only last value of group to new column
df['mean_e'] = np.where(~m.duplicated(keep='last') & ~df1.isnull().all(axis=1), 
                        df['e'].groupby(m).transform('mean'), 
                        np.nan)

print (df)
      a      c      d   e     mean_e
0   NaN    NaN    NaN   3        NaN
1   NaN    NaN    NaN   4        NaN
2   0.0    NaN    NaN   5        NaN
3   0.0    NaN    NaN   6        NaN
4   0.0    NaN    NaN   8        NaN
5   0.0    NaN    NaN  10   7.250000
6   NaN  400.0    NaN  11        NaN
7   NaN  400.0    NaN  54        NaN
8   NaN  400.0    NaN  56        NaN
9   NaN  400.0    NaN  46        NaN
10  NaN  400.0    NaN  95        NaN
11  NaN  400.0    NaN  89        NaN
12  NaN  400.0    NaN  45  56.571429
13  NaN    NaN  300.0   4        NaN
14  NaN    NaN  300.0   5        NaN
15  NaN    NaN  300.0   6        NaN
16  NaN    NaN  300.0   8        NaN
17  NaN    NaN  300.0  10        NaN
18  NaN    NaN  300.0  11   7.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...