Применить Zscore после группового в python - PullRequest
2 голосов
/ 17 апреля 2020

Я пытаюсь применить функцию к сгруппированному набору данных.
Для этого у меня есть pandas dataframe:

test_df = pd.DataFrame({
        'A':list('aabdee'),
        'AA':['2020-03-22', '2020-03-22', '2020-03-29', '2020-03-22','2020-03-22', '2020-03-29'],
         'B':[1,0.5,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'D':[1,3,1,7,1,1],
         'E':[5,3,6,9,2,4]
})

И я хочу применить Zscore к каждому столбцу (сгруппированному по переменные А и АА). Итак, я сделал:

numeric_columns = test_df.select_dtypes(np.number)
test_df.groupby(['A', 'AA'])[numeric_columns.columns].apply(stats.zscore)

Но тогда у меня много ошибок, таких как:

Series.name must be a hashable type

и это:

RuntimeWarning: invalid value encountered in true_divide
  return (a - mns) / sstd

Любая помощь приветствуется! Большое спасибо!

1 Ответ

1 голос
/ 17 апреля 2020

Для меня работает GroupBy.transform:

numeric_columns = test_df.select_dtypes(np.number)

c = numeric_columns.columns
test_df[c] = test_df.groupby(['A', 'AA'])[c].transform(stats.zscore)

print (test_df)
   A          AA    B    C    D    E
0  a  2020-03-22  1.0 -1.0 -1.0  1.0
1  a  2020-03-22 -1.0  1.0  1.0 -1.0
2  b  2020-03-29  NaN  NaN  NaN  NaN
3  d  2020-03-22  NaN  NaN  NaN  NaN
4  e  2020-03-22  NaN  NaN  NaN  NaN
5  e  2020-03-29  NaN  NaN  NaN  NaN

РЕДАКТИРОВАТЬ:

c = numeric_columns.columns
for g, df in  test_df.groupby(['A', 'AA']):
    print (df)

   A          AA    B  C  D  E
0  a  2020-03-22  1.0  7  1  5
1  a  2020-03-22  0.5  8  3  3
   A          AA    B  C  D  E
2  b  2020-03-29  4.0  9  1  6
   A          AA    B  C  D  E
3  d  2020-03-22  5.0  4  7  9
   A          AA    B  C  D  E
4  e  2020-03-22  5.0  2  1  2
   A          AA    B  C  D  E
5  e  2020-03-29  4.0  3  1  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...