Pandas 转换:创建具有函数的两列

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

如何实现这一目标?


缥缈止盈
浏览 169回答 1
1回答

繁星coding

您可以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  label0      1      5  1.135550      01      2      2  1.000000      02      1     10  1.297771      13      2     20  1.000000      14      1      7  0.162221      1但是为了获得更好的性能,可以在 out of 之后更改groupbyfor scoreonly 和labelcolumn count 的代码groupby:def z_score(x):   z = np.abs(stats.zscore(x))   return zdf['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  label0      1      5  1.135550      01      2      2  1.000000      02      1     10  1.297771      13      2     20  1.000000      14      1      7  0.162221      1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python