您的位置 首页 > 数码极客

pandas如何分割数据库

介绍

在处理连续的数值数据时,将数据分箱成多个桶进行进一步分析通常是很有帮助的。这里有几个不同的术语,包括装桶、离散分箱、离散化或量子化。Pandas使用cut和qcut函数支持这些方法。本文将简要描述为什么要分箱数据,以及如何使用Pandas函数将连续数据转换为一组离散的桶(bucket)。与许多Pandas函数一样,cut和qcut看起来很简单,但是这些函数包含了很多功能。即使对于更有经验的用户,我认为您也会学到一些对您自己的分析有用的技巧。

分箱

最常见的分箱实例之一就是在创建直方图时系统在幕后为您完成的东西。下面的客户销售数据直方图显示了如何将连续的销售数据分成离散的桶(例如:$60,000 - $70,000),然后用于对账户实例进行分组和计数。

下面的代码展示了我们如何汇总一组客户的2018年的销售信息。此表显示了拥有在一定范围内销售额的客户数量。如果您愿意深入研究一下,您可以在这个notebook中找到示例代码。

在许多其他场景中,您可能需要定义自己的箱。在上面的例子中,有8个带有数据的箱。如果我们想把我们的客户分成3个、4个或5个组呢?这就是pandas的qcut和cut发挥作用的时候了。这些函数听起来很相似,执行的功能也很相似,但是它们之间的差异可能会让新用户感到困惑。它们也有几个选项,可以使它们在日常的分析中非常有用。本文的其余部分将展示它们的区别以及如何使用它们。

qcut

Pandas文档将qcut描述为“基于量化的离散化函数”。这基本上意味着qcut会尝试将底层数据划分为相同大小的箱(bin)。该函数使用基于数据分布的百分比来定义箱,而不是箱的实际数字边界。

如果您使用了pandas的 describe函数,您就已经看到了一个由qcut表示的底层概念的例子:

当我们考虑直接使用qcut时,请记住25%、50%和75%的百分比值。

qcut最简单的用法是定义分位点的数量,并让pandas找出分割数据的方法。在下面的例子中,我们告诉pandas去创建4个大小相等的数据分组。

其结果是一个代表销售箱的分类系列。因为我们要求q=4的分位点,所以箱与describe函数中的百分位数相匹配。

一个常见的用例是将箱结果存储回原始的dataframe中,以便进一步分析。对于本例,我们将创建4个箱(又称四分位点)和10个箱(又称十分位点),并将结果存储回原始dataframe中:

您可以看到quantile_ex_1和quantile_ex_2之间的箱大相径庭。我还介绍了使用precision来定义要使用多少个小数点来计算箱精度。

另一个有趣的视图是使用value_counts来查看这些值是如何分布在各个箱中的:

现在,对于第二列:

这说明了一个关键的概念。在每种情况下,每个箱中都有相同数量的观察值。Pandas在幕后执行数学运算来计算出每个箱的宽度。例如,在quantile_ex_1中,第一个箱的范围是74,661.15,而第二个箱的范围仅为9,861.02(110132 - 100271)。

这种方法的挑战之一是,向最终用户解释箱标签不是很容易。例如,如果我们想要像航空公司的常飞旅客方法那样将我们的客户分成5个组(又名五分位点),我们可以显式地给箱贴上标签,以使它们更容易理解。

在上面的例子中,我做了一些不同的事情。首先,我显式地定义了要使用的分位点范围:q=[0, .2, .4, .6, .8, 1]。我还定义了在表示箱时使用的标签label =bin_labels_5。

我们来看看分布情况:

正如预期的那样,我们现在在5个箱中有一个相等的客户分布,结果以一种容易理解的方式进行显示。

使用qcut时要记住的一个重要事项是,分位点都必须都小于1。下面是一些分布的例子。在大多数情况下,仅仅将q定义为一个整数会更简单一些:

  • 三分位点: q=[0, 1/3, 2/3, 1] 或 q=3

  • 五分位点: q=[0, .2, .4, .6, .8, 1] 或 q=5

  • 六分位点: q=[0, 1/6, 1/3, .5, 2/3, 5/6, 1] 或 q=6

您可能会有一个疑问,我怎么知道用什么范围来识别不同的箱呢?您可以使用retbins=True来返回箱标签。下面是构建快速引用表的一段代码:

这是我在写这篇文章时学到的另一个技巧。如果您在分类值上尝试执行df.describe,您会得到不同的总结结果:

我认为这是有用的,也是对qcut工作原理的一个很好的总结。

>>> 今日签到口令:nryh <<<

当我们讨论describe时,我们可以使用percentiles参数并使用与qcut相同的格式来定义我们的百分位:

关于这个功能有一点需要注意。传入0或1,仅仅意味着0%将与最小值相同,而100%将与最大值相同。我还了解到,无论传递的值是什么,第50个百分位数总是会被包含在内。

在我们继续描述cut之前,还有一种可能的方法可以供我们来标记我们的箱。我们可以通过传递labels=False来返回整数,而不是箱范围或自定义标签。

就我个人而言,我认为使用bin_labels是最有用的场景,但是在某些情况下整数响应可能会有帮助,所以我想明确指出这一点。

cut

既然我们已经讨论了如何使用qcut,我们就可以展示cut的不同之处。我们上面讨论的许多概念都适用于cut,但是cut的用法也有几个不同之处。

主要区别在于,qcut将计算每个箱的大小,以确保bins中的数据分布是相等的。换句话说,所有的箱将有(大致)相同数量的观察值,但箱的范围将有所不同。

另一方面,cut被用来具体地定义箱的边界。每个箱中项的分布式没有任何保证的。实际上,您可以这种方式来定义箱中不包含任何项,或者几乎所有项都在一个单个箱中。

在实际的例子中,箱可能会由业务规则进行定义。对于一个常飞旅客计划来说,25,000英里是银牌会员水平,并不会随着数据的年复一年的变化而变化。如果我们想定义箱的边界(25,000 - 50,000,等等),我们将会使用cut。我们还可以使用cut来定义固定大小的箱,并让pandas找出定义这些箱边界的方式。

一些例子应该能清楚地说明这种区别。

为了简单起见,我删除了前面的列,以保持例子简短:

对于第一个例子,我们可以将数据分成4个大小相等的箱。Pandas将在幕后执行数学运算,以确定如何将数据集分成这4个组:

让我们看看分布情况:

首先您会注意到箱范围大约都是32,265,但是箱元素的分布是不相等的。箱有这样一个分布:每个箱中分别有12、5、2和1个项。简而言之,这就是cut和qcut的本质区别。

信息

如果您想让您的箱里的项平均分配,请使用qcut。如果您想定义自己的数字的箱范围,那么请使用cut。

在继续之前,我想快速复习一下间隔符号。在上面的例子中,我们使用了大量的和来说明箱边界是如何定义的。对于那些可能需要复习一下间隔符号的人(比如我)来说,我发现这个简单的站点非常易于理解。

为了更好地理解我们的例子,这里有一个基于上面例子的图表:

当使用cut时,您可能会定义箱的确切边界,因此了解边界是否包含值是很重要的。根据数据集和特定的用例,这可能是一个大问题,也可能不是。这当然是您需要考虑的一个微妙的问题。

要正确看待这个问题,当您向别人展示您的分析结果时,您需要弄清楚一个销售额为7万美元的账户是银牌会员客户还是金牌会员客户。

下面是一个例子,我们想通过定义bins参数来具体定义我们的4个箱边界。

使用cut定义箱范围的一个挑战是,创建所有箱范围的列表可能很麻烦。我们可以使用一些快捷方式来创建所需的范围。

首先,我们可以使用num来创建一个等间距的范围:

Numpy的linspace是一个简单的函数,它在用户定义的范围内提供一个均匀间隔的数字数组。在这个例子中,我们需要9个在0到200,000之间的等间距的分割点。敏锐的读者可能会注意到,我们有9个数字,但只有8个类别。如果您画出实际的类别,您就会明白为什么我们在0到200000之间最后得到了8个类别。在所有情况下,类别数都比分割点数少一个。

另一种选择是使用num,它也提供了类似的功能。我发现这篇文章(地址: )对理解这两个函数很有帮助。我建议您尝试这两种方法,看看哪种最适合您的需要。

还有一个额外选择可以用于定义您的箱,即使用pandas interval_range。我看了pandas文档才找到它。它是有点深奥,但我认为最好还是把它包括进来。

interval_range提供了很大的灵活性。例如,它可以用于日期范围和数值。下面是一个数值的例子:

使用interval_range有一个缺点,那就是您不能定义自定义标签。

如上所示,在使用interval_range时labels参数被忽略了。

以我的经验来说,如果我有大量的箱,我会使用一个自定义的箱范围列表或linspace。

cut和qcut之间的一个区别是,您还可以使用include_lowest参数来定义第一个箱是否应该包含所有的最低值。最后,传入right=False将更改箱以排除最右边的项。因为cut允许箱具有更多的具体性,所以这些参数有助于确保您以您期望的方式来定义间隔。

cut的其余功能与qcut类似。我们可以使用retbins=True来返回箱,或者使用precision参数来调整精度。

我想介绍的最后一个技巧是,value_counts包含了一个分箱和计数数据的便捷方法。这有点类似于可以将describe作为qcut的一个便捷方法的方式。

如果我们想把一个值分箱成4个箱,并计算每个箱的数目:

默认情况下, value_counts将首先对最高的值进行排序。通过传入sort=False,箱将按数字顺序进行排序,这是一个有用的视角。

总结

将连续值分解成离散的箱的概念比较容易理解,并且在现实世界的数据分析中也是一个很有用的概念。幸运的是,pandas提供了cut和qcut函数,可以根据您的需要使数据分箱过程变得简单或复杂。我希望本文对于您理解这些pandas函数有所帮助。如果您有任何问题,请在下方进行评论。

更新

2019年10月29日:修改为包含value_counts便捷方法,用于分箱和统计数据。

素材

照片来自Unsplash上的Radek Grzybowsk

英文原文:
译者:天天向上

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“pandas如何分割数据库”边界阅读