【问题标题】:Cleanest way to bin using Pandas.cut使用 Pandas.cut 最干净的装箱方式
【发布时间】: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 仍然被格式化为字符串。快速转换为数字使其像魅力一样工作。

标签: python pandas icd


【解决方案1】:

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

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)

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

【讨论】:

  • 这是完美的,正是我想要的。它干净、快速且按预期工作。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多