根据现有列中的唯一文本值创建新的Z-Score列

问题描述

系统:O365

IDE: JupyterLab

语言:Python版本3.7.3

:熊猫版本1.0.1

数据源:亲自构建

Http api文档 https://github.com/RTICWDT/open-data-maker/blob/master/API.md

您好,我想知道是否有人知道如何利用列范围内的条件设置返回值。例如,我想在看到下一组值后根据范围内的相似值返回z分数。

已采取的步骤:

  1. 内置了以下功能,似乎位于其中一半,但并非如此

代码

# get data
df0 = pd.read_csv('data/erpservicedesk.csv')
df0.columns

# put z-score into a lamda
zscore = lambda x: (x - x.mean()) / x.std()

# build datafram with the important features
df1 = df0[['Incident ID*+','Res.Prod.Cat.TierII','Res.Op.Cat.TierIII','Mean-Time-Tckt-Close']]

df1.insert(4,'ZofMTTC',df1.groupby(['Res.Prod.Cat.TierII','Res.Op.Cat.TierIII'])['Mean-Time-Tckt-Close'].transform(zscore))

df2 = df1.sort_values(by=['Res.Prod.Cat.TierII'])
df2.head(100)

问题

我的lambda函数似乎不是基于新列值的条件,因为它似乎对整个数据帧而不是对每个新实例“ Res.Prod.Cat.TierII”采用“平均时间-Tckt-Close”

示例

A B C
Bob Store 10
Bob Store 11
Bob Store 8
Alfred Store 12
Alfred Store 9

我需要一个新的D列,以根据Bob和Alfred各自的数据来反映他们的Z分数。

解决方法

使用您的示例,您可以使用.groupby创建dfs来存储均值和标准差,然后在lambda函数中访问它们:

import pandas as pd

## recreate example df
df = pd.DataFrame({'A':['Bob']*3+['Alfred']*2,'B':['Store']*5,'C':[10,11,8,12,9]})

df_mean =  df.groupby('A').mean()
df_std =  df.groupby('A').std()

## apply the function along each row,using axis=1
df['D'] = df.apply(lambda x: (x['C'] - df_mean.loc[x['A']]) / df_std.loc[x['A']],axis=1)

输出:

>>> df
        A      B   C         D
0     Bob  Store  10  0.218218
1     Bob  Store  11  0.872872
2     Bob  Store   8 -1.091089
3  Alfred  Store  12  0.707107
4  Alfred  Store   9 -0.707107