使用 Pandas.cut 进行垃圾箱最干净的方式

Cleanest way to bin using Pandas.cut

这个 post 的目的主要是讨论,因此即使是松散的想法或牵线搭桥也将不胜感激。我正在尝试对一些数据进行分箱以供分析,并且想知道使用 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 功能似乎与我的词典不太相配。似乎有一种方法可以使用数据框作为具有最小值和最大值 的查找 table,这似乎是一种可能性(下面的示例):

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 开头,目前我正计划对这些代码进行预处理,将它们转换为范围的扩展并以这种方式处理它们。例如,如果可能的 non-E/V 代码范围是 range(0,1000),那么我可以将 E 转换为 range(1000, 2000),将 V 转换为 range(2000, 3000),这样我就可以维护单个查找table 或所有代码的字典,我可以从中切入我想要的多个箱子。也就是说,这种方法会导致无法一目了然地理解这些代码,所以如果有更好的方法来处理这个问题,我愿意接受建议。

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

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)

我同意字典(除了本身就是一种非常快速、多功能的数据结构之外!)是一种非常好的方式,可以在您的代码中提供一些关于数据含义的上下文。如果我需要字典作为文档的一部分,我经常使用一个小的 "black-box" 函数来完成实际工作。