熊猫变换:创建具有功能的两列

时间:2019-03-08 06:19:46

标签: python pandas transform apply pandas-groupby

我有一个数据框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

我正在尝试借助函数输出和pandas转换方法在数据框中创建两列

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

但是在运行上面的代码段后却得到以下错误

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

如何实现?

1 个答案:

答案 0 :(得分:3)

您可以在函数中返回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的{​​{1}}和score的列数而更改label的代码:

groupby