Среднее по серии, пропускающий элемент [0] - PullRequest
0 голосов
/ 27 февраля 2019

У меня в столбце данных есть столбец, в котором в каждой строке содержатся серии различного размера:

values
[0.0,2.3,4.6,99,100,200,...]
[0.0,4.6,7.8,10,20,25,10,5.5,12,...]
.
.
.

Среднее значение каждой серии вычислено следующим образом:

from statistics import mean
df['average_values'] = df['values'].map(mean)
df.head()

Это возвращает:

values                          average_values   
[0.0,2.3,4.6,99,100,200,...]            7.6
[0.0,4.6,7.8,10,20,25,...]              10.5
.
.
.

Однако каждый из этих рядов начинается с 0.0, и мне нужно удалить это из расчета в среднем столбце.

Моя попытка

Я попытался создать новый столбец «nan_values», который бы копировал столбец исходных значений, но все значения 0.0 были заменены на NaN:

#create new column
df['nan_values'] = df['values'].copy()

#replace the 0.0 in each series with NaN
df['nan_values'] = df['nan_values'].replace(0, np.NaN)

Я думал, что получу серию, которая выглядит как:

[NaN, 2.2, 4.4, 5, 3.3, 7.1, ...]

Мне нужно вычислить среднее для многих рядов рядов, но пропустить элемент с индексом 0.

1 Ответ

0 голосов
/ 27 февраля 2019

Удалить первое значение путем индексации [1:]:

from statistics import mean
df['average_values'] = df['values'].map(lambda x: mean(x[1:]))

Или:

df['average_values'] = df['values'].str[1:].map(mean)
#alternative
#df['average_values'] = df['values'].str[1:].map(np.mean)

print (df)
                                     values  average_values
0             [0.0, 2.3, 4.6, 99, 100, 200]         81.1800
1  [0.0, 4.6, 7.8, 10, 20, 25, 10, 5.5, 12]         11.8625

Если хотите удалить 0 значения, используйте понимание списка с фильтрациейили filter:

df['average_values'] = df['values'].map(lambda x: mean([y for y in x if y != 0]))

Или:

df['average_values'] = df['values'].map(lambda x: mean(filter(lambda y: y != 0, x)))
...