python - Pandas Groupby 将功能应用于组
问题描述
我有这个功能:
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.join
withDataFrame.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
推荐阅读
- java - java.lang.UnsupportedOperationException:反射 setAccessible(true) 已禁用
- c# - 不必要的 NullReferenceException?
- javascript - 如何在javascript中为蛇添加头部
- javascript - 更新后如何重新渲染 Formik 值 - React Native?
- github - 我可以将其他 git 存储库导入到我的存储库吗?
- ios - 我们如何使用 swiftUI 获取数据并像 viewdidload 一样显示
- python - 在 Pandas 中按数据类型处理数据
- batch-file - 带有批处理文件的 Veracrypt:如果未安装驱动器,如何停止执行?
- javascript - 循环后 Node.js 似乎没有释放内存
- swift - 以编程方式动态单元格高度