Характеризация населения с помощью данных группировки stats.zscore - PullRequest
0 голосов
/ 10 октября 2019

У меня есть DataFrame, структурированный так:

df = pd.DataFrame([['A', np.random.randint(100)], ['B', np.random.randint(100)], ['B', np.random.randint(100)], ['A', np.random.randint(100)], ['A', np.random.randint(100)], ['B', np.random.randint(100)], ['B', np.random.randint(100)], ['A', np.random.randint(100)], ['A', np.random.randint(100)]], columns = ['type', 'value'])

   type value
0   A   14
1   B   7
2   B   84
3   A   53
4   A   83
5   B   90
6   B   78
7   A   60
8   A   23

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

  1. Среднее значениезначения, превышающие заданный stats.zscore
  2. Среднее значение, меньшее заданного stats.zscore

Если бы был один тип, я сделал бы это следующим образом:

outliers_mean = df.loc[np.abs(stats.zscore(df.value))>z_level].value.mean()
not_outliers_mean = df.loc[np.abs(stats.zscore(df.value))<z_level].value.mean()

Однако, поскольку я рассматриваю несколько типов, я не могу этого сделать, потому что stats.zscore должен учитывать совокупность, принадлежащую одному типу.

1 Ответ

1 голос
/ 10 октября 2019

IIUC, Вы могли бы сделать что-то вроде этого:

import pandas as pd
import numpy as np

from scipy import stats

# set seed for reproducibility
np.random.seed(42)


df = pd.DataFrame([['A', np.random.randint(100)], ['B', np.random.randint(100)], ['B', np.random.randint(100)],
                   ['A', np.random.randint(100)], ['A', np.random.randint(100)], ['B', np.random.randint(100)],
                   ['B', np.random.randint(100)], ['A', np.random.randint(100)], ['A', np.random.randint(100)]],
                  columns=['type', 'value'])

# set z_level (for demo purposes)
z_level = 1.0

# get the z-score by type and mark those above z_level
df['outlier'] = np.abs(df.groupby('type').transform(stats.zscore)) > z_level

# compute mean
result = df.groupby(['type', 'outlier']).mean()

print(result)

Вывод

                  value
type outlier           
A    False    68.333333
     True     68.500000
B    False    51.000000
     True     53.000000

Таким образом, в итоге у вас есть среднее агрегирование по типу и выбросузначение маски. Если вы хотите исключить значения, равные z_level, вы можете сделать это на отдельном шаге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...