簡體   English   中英

Pandas Groupby 將函數應用於組

[英]Pandas Groupby apply function to group

我有這個功能:

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)

我似乎無法弄清楚如何將真/假異常值結果添加為新列。

使用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如果任何值在一行中為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  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM