【发布时间】:2017-10-31 16:33:26
【问题描述】:
这篇文章的目的主要是讨论,因此即使是松散的想法或要拉扯的字符串也将不胜感激。我正在尝试对一些数据进行分类以进行分析,并且想知道使用Pandas.cut 对我的数据进行分类的最干净的方法是什么。在某些情况下,我特别尝试将 ICD-9 诊断数据分类并使用this list 作为起点。从我正在阅读的内容来看,一种常见的方法是这样的:
break_points = [0, 139, 239, ...]
labels = ['infectious and parasitic diseases', 'neoplasms', 'endocrine diseases', ...]
df['diag_codes_binned'] = pd.cut(df['diag_codes'],
bins=break_points,
labels=labels)
我认识到这是一种功能完善的方法,但我不喜欢目视检查代码并确定哪些范围与哪些标签对齐是多么困难。我正在探索使用这样的字典:
diagnosis_code_dict = {139: 'infectious and parasitic diseases',
239: 'neoplasms',
279: 'endocrine diseases',
...}
但是 pd.cut 函数似乎与我的字典不太协调。似乎有一种方法可以使用数据框作为具有最小值和最大值的查找表shown here,这似乎是一种可能性(下面的示例):
In [187]: lkp
Out[187]:
Min Max Val
0 1 99 AAA
1 100 199 BBB
2 200 299 CCC
3 300 399 DDD
最后,我对我正在通过最佳处理方式处理的数据集还有一个考虑。一些诊断代码以 V 或 E 开头,目前我正计划对它们进行预处理以将它们转换为范围的扩展并以这种方式处理它们。例如,如果可能的非 E/V 代码的范围是 range(0,1000),那么我可以将 E 转换为 range(1000, 2000) 并将 V 转换为 range(2000, 3000),这样我就可以为所有代码维护一个查找表或字典我可以从中切出任何我想要的垃圾箱。也就是说,这种方法会导致无法一目了然地理解这些代码,所以如果有更好的方法来处理这个问题,我愿意接受建议。
【问题讨论】:
-
你能提供一个小的可重复的样本数据集和你想要的数据集吗?请阅读how to make good reproducible pandas examples并相应地编辑您的帖子。
-
我没有回答您问题的第二部分(关于 E 和 V 代码),部分原因是您可以通过多种不同的方式来做到这一点。您遇到的方式很可能是最简洁的:您可以将 E 字符串替换为另一个整数(如 3,因此 E001 变为 3001),然后将所有类别添加到您的字典中并完成。只要你把这部分评论好,我认为这是一个明智、简单的解决方案。
-
@HFBrowning,因为代码的格式不一致,因为 char 后跟 3 个数字,所以我决定只使用一个简单的 lambda,它将任何以 E/V 开头的字符串转换为 1000/2000。因为我不打算在 E/V 中划分子类别,所以这是一个可以接受的解决方案。我会注意到,我花了比我想承认的时间更长的时间来弄清楚为什么我的 pd.cut 函数无法处理数据 - 即使现在一切都是数字,df 仍然被格式化为字符串。快速转换为数字使其像魅力一样工作。