Преобразование панд: создание двух столбцов с функцией - PullRequest
1 голос
/ 08 марта 2019

у меня есть датафрейм df

df:

GROUP VALUE
 1     5
 2     2
 1     10
 2     20
 1     7

И функция

import numpy as np
from scipy import stats

def z_score(x):
   z = np.abs(stats.zscore(x))
   c = np.where(x > 5, 1, 0)
   return z,c

И я пытаюсь создать два столбца в кадре данных с помощью функции вывода и метода преобразования панд

df['zscore'], df['label'] = a.groupby(['GROUP'])['VALUE'].transform(z_score)

Но после запуска приведенного выше фрагмента появляется следующая ошибка

ValueError: Length of passed values is 2, index implies 3

Как этого добиться?

1 Ответ

3 голосов
/ 08 марта 2019

Вы можете вернуть DataFrame в функции:

def z_score(x):
   z = np.abs(stats.zscore(x))
   c = np.where(x > 5, 1, 0)
   return pd.DataFrame({'zscore':z,'label':c}, index=x.index)

df[['zscore','label']] = df.groupby(['GROUP'])['VALUE'].apply(z_score)
print (df)
   GROUP  VALUE    zscore  label
0      1      5  1.135550      0
1      2      2  1.000000      0
2      1     10  1.297771      1
3      2     20  1.000000      1
4      1      7  0.162221      1

Но для повышения производительности возможно изменить код на groupby только для score и label число столбцов после выхода из groupby:

def z_score(x):
   z = np.abs(stats.zscore(x))
   return z

df['zscore'] = df.groupby('GROUP')['VALUE'].transform(z_score)
#lambda function alternative
#df['zscore'] = df.groupby('GROUP')['VALUE'].transform(lambda x: np.abs(stats.zscore(x)))
df['label'] = np.where(df['VALUE'] > 5, 1, 0)
print (df)
   GROUP  VALUE    zscore  label
0      1      5  1.135550      0
1      2      2  1.000000      0
2      1     10  1.297771      1
3      2     20  1.000000      1
4      1      7  0.162221      1
...