我有一个数据框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
如何实现?
答案 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