средние значения панд с условием где - PullRequest
0 голосов
/ 30 августа 2018

Я хотел бы рассчитать среднее значение возраста, исключая значение 99. В реальной жизни датафрейм намного больше, и у меня есть другие возможные переменные.

Есть ли более эффективный способ (быстрее или элегантнее) сделать это? Может быть, с помощью сводной таблицы или группы по, или функции?

data = {'age': [99,45,34,32,34,67,5,6,7,8,3,5]}
df = pd.DataFrame(data, columns = ['age'])

not99 = df['age'] != 99

mean_for_age = df.loc[not99, 'age'].mean()

1 Ответ

0 голосов
/ 30 августа 2018

numpy решение быстрее - сначала создайте массив, а затем отфильтруйте:

arr = df['age'].values
not99 = arr != 99

mean_for_age = arr[not99].mean()

Но если вам нужно общее решение для возможного выбора другого столбца, используйте ваше решение:

not99 = df['age'] != 99
mean_for_age = df.loc[not99, 'age'].mean()

mean_for_age = df.loc[not99, 'another col'].mean()

Сроки (зависит от данных, лучший тест с реальными данными):

data = {'age': [99,45,34,32,34,67,5,6,7,8,3,5]}
df = pd.DataFrame(data, columns = ['age'])

df = pd.concat([df] * 10000, ignore_index=True)


In [14]: %%timeit
    ...: arr = df['age'].values
    ...: not99 = arr != 99
    ...: 
    ...: mean_for_age = arr[not99].mean()
    ...: 
496 µs ± 36.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [15]: %%timeit
    ...: not99 = df['age'] != 99
    ...: mean_for_age = df.loc[not99, 'age'].mean()
    ...: 
1.82 ms ± 40.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [16]: %%timeit
    ...: df.query("age != 99")['age'].mean()
    ...: 
4.26 ms ± 40.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
...