python qcut_python bin数据和返回bin中点(可能使用pandas.cut和qcut)

这篇博客探讨了如何使用Python的pandas库中的`pd.cut`和`pd.qcut`函数对数据进行分位切割,并获取每个分位区间的中点。通过传递`retbins=True`参数可以获取分位区间,然后计算中点。同时,讨论了不同情况下处理分位区间端点的方法,包括使用IntervalIndex和直接访问分类间隔的left和right属性来计算中点。
摘要由CSDN通过智能技术生成

3 个答案:

答案 0 :(得分:5)

正在进行的工作proposal适用于IntervalIndex'这将使这种类型的操作非常简单。

但是现在,您可以通过传递retbins参数来获取分档并计算中点。

In [8]: s, bins = pd.cut(pd.Series(np.arange(11)), bins = 5, retbins=True)

In [11]: mid = [(a + b) /2 for a,b in zip(bins[:-1], bins[1:])]

In [13]: s.cat.rename_categories(mid)

Out[13]:

0 0.995

1 0.995

2 0.995

3 3.000

4 3.000

5 5.000

6 5.000

7 7.000

8 7.000

9 9.000

10 9.000

dtype: category

Categories (5, float64): [0.995 < 3.000 < 5.000 < 7.000 < 9.000]

答案 1 :(得分:2)

我看到这是一篇很老的帖子,但无论如何我都会冒昧地回答它。

现在可以(参考@ chrisb&#39;答案)使用left和right访问分类间隔的终点。

s = pd.cut(pd.Series(np.arange(11)), bins = 5)

mid = [(a.left + a.right)/2 for a in s]

Out[34]: [0.995, 0.995, 0.995, 3.0, 3.0, 5.0, 5.0, 7.0, 7.0, 9.0, 9.0]

由于间隔向左开放并向右边靠近,因此首先是“第一个”。 interval(从0开始),实际上从-0.01开始。要使用0作为左值来获得中点,您可以执行此操作

mid_alt = [(a.left + a.right)/2 if a.left != -0.01 else a.right/2 for a in s]

Out[35]: [1.0, 1.0, 1.0, 3.0, 3.0, 5.0, 5.0, 7.0, 7.0, 9.0, 9.0]

或者,您可以说间隔向左关闭并向右开启

t = pd.cut(pd.Series(np.arange(11)), bins = 5, right=False)

Out[38]:

0 [0.0, 2.0)

1 [0.0, 2.0)

2 [2.0, 4.0)

3 [2.0, 4.0)

4 [4.0, 6.0)

5 [4.0, 6.0)

6 [6.0, 8.0)

7 [6.0, 8.0)

8 [8.0, 10.01)

9 [8.0, 10.01)

10 [8.0, 10.01)

但是,如您所见,您在最后一个时间间隔会遇到同样的问题。

答案 2 :(得分:0)

我注意到类别具有mid属性,因此您可以通过apply计算中间值:

In [1]: import pandas as pd

...: import numpy as np

...: df = pd.DataFrame({"val":np.arange(11)})

...: df["bins"] = pd.cut(df["val"], bins = 5)

...: df["bin_centres"] = df["bins"].apply(lambda x: x.mid)

...: df

Out[1]:

val bins bin_centres

0 0 (-0.01, 2.0] 0.995

1 1 (-0.01, 2.0] 0.995

2 2 (-0.01, 2.0] 0.995

3 3 (2.0, 4.0] 3.000

4 4 (2.0, 4.0] 3.000

5 5 (4.0, 6.0] 5.000

6 6 (4.0, 6.0] 5.000

7 7 (6.0, 8.0] 7.000

8 8 (6.0, 8.0] 7.000

9 9 (8.0, 10.0] 9.000

10 10 (8.0, 10.0] 9.000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值