Python 3.x 基于现有列中的唯一文本值创建新的Z分数列

Python 3.x 基于现有列中的唯一文本值创建新的Z分数列,python-3.x,pandas,statistics,pandas-groupby,transform,Python 3.x,Pandas,Statistics,Pandas Groupby,Transform,系统:O365 IDE:JupyterLab 语言:Python版本3.7.3 库:熊猫1.0.1版 数据源:个人制作 Http API文档: 您好,我想知道是否有人知道如何使用列范围内的条件设置返回值。例如,我希望在看到下一组值后,根据变化范围内的相似值返回z分数 已采取步骤: # get data df0 = pd.read_csv('data/erpservicedesk.csv') df0.columns # put z-score into a lamda zscore = lamb

系统:O365

IDE:JupyterLab

语言:Python版本3.7.3

库:熊猫1.0.1版

数据源:个人制作

Http API文档:

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

已采取步骤:

# 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)
  • 构建了下面的函数,它似乎已经完成了一半,但还没有完成
  • 代码:

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

    示例

    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
    

    这种方法效果很好。但是,我注意到,在尝试将列添加到数据帧切片时,出现了如下错误:“试图在数据帧切片的副本上设置一个值。请尝试改用.loc[row\u indexer,col\u indexer]=value”你明白为什么会这样吗?我阅读了文档,看起来熊猫队希望你要么添加到原始数据帧上,要么创建一个全新的数据帧。当你使用数据帧切片时,会发生这种情况,但你是否要修改原始df的切片是不明确的,当您使用链式赋值时会发生这种情况。例如:
    df[df['some_column']==10]['some_other_column']=1000
    将抛出该错误。