【问题标题】:Create new Z-Score column based off unique text values in an existing column根据现有列中的唯一文本值创建新的 Z 分数列
【发布时间】:2020-12-24 05:25:00
【问题描述】:

系统: 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 函数不是基于新列值的条件,因为它似乎对整个数据帧采用“平均时间-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 分数。

【问题讨论】:

    标签: python-3.x pandas statistics pandas-groupby transform


    【解决方案1】:

    使用您的示例,您可以使用 .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_indexer,col_indexer] = value而是“你明白为什么这是我阅读文档,看起来熊猫本质上希望你要么添加到原始数据框,要么创建一个全新的数据框。
    • 当您使用数据帧切片时会发生这种情况,但是您是否要修改原始 df 的切片是不明确的,并且当您使用链式分配时会发生这种情况。例如:df[df['some_column']== 10]['some_other_column'] = 1000 将抛出该错误。
    猜你喜欢
    • 2019-04-17
    • 2021-12-08
    • 2021-04-19
    • 1970-01-01
    • 2020-10-14
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多