0

这篇文章的目的主要是讨论,所以即使是松散的想法或线索也将不胜感激。我正在尝试对一些数据进行分类以进行分析,并且想知道使用Pandas.cut. 在某些情况下,我特别尝试将 ICD-9 诊断数据分类并使用此列表作为起点。从我正在阅读的内容来看,一种常见的方法是这样的:

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 函数似乎与我的字典不太协调。似乎有一种方法可以使用数据框作为具有最小值和最大值的查找表,如图所示,这似乎是一种可能性(下面的示例):

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 转换为 arange(1000, 2000)并将 V 转换为 a range(2000, 3000),这样我就可以为所有代码维护一个查找表或字典,我可以从中切入许多 bin我想了。也就是说,这种方法会导致无法一目了然地理解这些代码,所以如果有更好的方法来处理这个问题,我愿意接受建议。

4

1 回答 1

2

我会简单地编写一个小辅助函数。这是一个想法:

import pandas as pd

def bin_helper(code_dict):
    break_points = [0] + sorted(code_dict) #0 added for lower bound on binning
    labels = [code_dict[value] for value in sorted(code_dict)]
    return break_points, labels

# Setting up some minimal reproducible code...
data = {'diag_codes': range(1, 300),
        'diag_codes_binned': ''}
df = pd.DataFrame.from_dict(data)
diag_code_dict = {139: 'infectious and parasitic diseases',
                  239: 'neoplasms',
                  279: 'endocrine diseases'}

# Run the function and drop it into pandas.cut
bins, labels = bin_helper(diag_code_dict)
df['diag_codes_binned'] = pd.cut(df['diag_codes'],
                                 bins=bins,
                                 labels=labels)

我同意字典(除了本身就是一种非常快速、多功能的数据结构!)是一种非常好的方法,可以在代码中提供一些关于数据应该意味着什么的上下文。如果我需要字典作为文档的一部分,我经常使用一个小的“黑盒”功能来完成实际工作。

于 2017-10-31T17:57:32.387 回答