为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

缥缈止盈 2021-11-30 10:36:56
我有一个数据框 dfdf:GROUP VALUE 1     5 2     2 1     10 2     20 1     7还有一个功能import numpy as npfrom scipy import statsdef 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 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

您可以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

但是为了获得更好的性能,可以在 out of 之后更改groupbyfor scoreonly 和labelcolumn count 的代码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


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信