【问题标题】:Pandas Groupby apply function to groupPandas Groupby 将功能应用于组
【发布时间】:2020-01-17 23:38:38
【问题描述】:

我有这个功能:

def is_outlier(points, thresh=3.5):
    if len(points.shape) == 1:
        points = points[:, None]
        median = np.nanmedian(points, axis=0)
        diff = np.sum((points - median)**2, axis=-1)
        diff = np.sqrt(diff)
        med_abs_deviation = np.nanmedian(diff)

        modified_z_score = 0.6745 * (diff / med_abs_deviation)

        return modified_z_score > thresh

我想按模态列分组并选择其他 3 列并创建一个新列,该列具有来自上述识别异常值的函数的真假结果。

数据:

    MODALITY    COMP_FINAL_TAT  ORD_FINAL_TAT   UNREAD_FINAL_TAT    ORD_UNREAD_TAT
0   MRI         12  394 5   389
1   CT          233 240 229 11
2   CT          204 205 188 16
3   RAD         245 302 243 59
4   RAD         240 297 238 59
5   RAD         234 291 232 59
6   RAD         236 294 235 59
7   MRI         170 -10 63  -73
8   RAD         239 296 237 59
9   RAD         251 256 251 4
10  RAD         147 176 146 29
11  MRI         25  -62 18  -80
12  MRI         527 -482    518 -1000
13  RAD         151 231 150 81

我想过这样做:outlierdf = df.groupby(['MODALITY'])['COMP_FINAL_TAT','ORD_FINAL_TAT','UNREAD_FINAL_TAT','ORD_UNREAD_TAT].transform(is_outlier)

我似乎无法弄清楚如何将真/假异常值结果添加为新列。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    DataFrame.joinDataFrame.add_suffix 一起使用 为选定的 4 个列中的每一个创建四个带有异常值的新列。

    df = df.join( df.groupby(['MODALITY'])['COMP_FINAL_TAT', 'ORD_FINAL_TAT',
                                         'UNREAD_FINAL_TAT', 'ORD_UNREAD_TAT']
                   .transform(is_outlier).add_suffix('_outlier'))
    print(df)
       MODALITY  COMP_FINAL_TAT  ORD_FINAL_TAT  UNREAD_FINAL_TAT  ORD_UNREAD_TAT  \
    0       MRI              12            394                 5             389   
    1        CT             233            240               229              11   
    2        CT             204            205               188              16   
    3       RAD             245            302               243              59   
    4       RAD             240            297               238              59   
    5       RAD             234            291               232              59   
    6       RAD             236            294               235              59   
    7       MRI             170            -10                63             -73   
    8       RAD             239            296               237              59   
    9       RAD             251            256               251               4   
    10      RAD             147            176               146              29   
    11      MRI              25            -62                18             -80   
    12      MRI             527           -482               518           -1000   
    13      RAD             151            231               150              81   
    
       COMP_FINAL_TAT_outlier ORD_FINAL_TAT_outlier  UNREAD_FINAL_TAT_outlier  \
    0                   False                 False                    False   
    1                   False                 False                    False   
    2                   False                 False                    False   
    3                   False                 False                    False   
    4                   False                 False                    False   
    5                   False                 False                    False   
    6                   False                 False                    False   
    7                   False                 False                    False   
    8                   False                 False                    False   
    9                   False                  True                    False   
    10                   True                  True                     True   
    11                  False                 False                    False   
    12                   True                 False                     True   
    13                   True                  True                     True   
    
       ORD_UNREAD_TAT_outlier  
    0                   False  
    1                   False  
    2                   False  
    3                   False  
    4                   False  
    5                   False  
    6                   False  
    7                   False  
    8                   False  
    9                    True  
    10                   True  
    11                  False  
    12                  False  
    13                   True  
    

    如果您想要True 如果any 值连续为True,请使用DataFrame.any

    df = df.join( df.groupby(['MODALITY'])['COMP_FINAL_TAT', 'ORD_FINAL_TAT',
                                         'UNREAD_FINAL_TAT', 'ORD_UNREAD_TAT']
                   .transform(is_outlier).any(axis=1).rename('outlier'))
    print(df)
    
    
       MODALITY  COMP_FINAL_TAT  ORD_FINAL_TAT  UNREAD_FINAL_TAT  ORD_UNREAD_TAT  \
    0       MRI              12            394                 5             389   
    1        CT             233            240               229              11   
    2        CT             204            205               188              16   
    3       RAD             245            302               243              59   
    4       RAD             240            297               238              59   
    5       RAD             234            291               232              59   
    6       RAD             236            294               235              59   
    7       MRI             170            -10                63             -73   
    8       RAD             239            296               237              59   
    9       RAD             251            256               251               4   
    10      RAD             147            176               146              29   
    11      MRI              25            -62                18             -80   
    12      MRI             527           -482               518           -1000   
    13      RAD             151            231               150              81   
    
        outlier  
    0     False  
    1     False  
    2     False  
    3     False  
    4     False  
    5     False  
    6     False  
    7     False  
    8     False  
    9      True  
    10     True  
    11    False  
    12     True  
    13     True  
    

    【讨论】:

    • .transform(is_outlier) 应该在这里工作,不是吗?
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2017-07-10
    • 2013-02-28
    • 2018-10-06
    • 2021-03-12
    • 2017-10-29
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多