首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas裁剪行为的#观测值不能被# of bins整除

Pandas裁剪行为的#观测值不能被# of bins整除
EN

Stack Overflow用户
提问于 2013-12-22 05:19:04
回答 1查看 2.3K关注 0票数 6

假设我有一个熊猫系列的美元价值,并想要离散成9组使用qcut。观察的#不能被9除。Server的ntile函数为这种情况提供了一种标准方法:它使9个组中的第一个n个观察值大于其余的(9-n)组。

我注意到,在熊猫中,对于x+1的观察,哪些组的任务似乎是随机的。我试着用algos破译代码,找出分位数函数是如何处理这个问题的,但没有弄清楚。

我有三个相关的问题:

  1. 有任何熊猫开发商能解释qcut的行为吗?是随机的,哪一组得到的观察更多?
  2. 是否有一种方法可以强迫qcutNTILE类似(即第一组得到x+1观测)?
  3. 如果#2的答案是否定的,那么对于一个像NTILE那样的函数,有什么想法吗?(如果这是一项复杂的工作,那么简单地介绍一下您的方法就会有帮助。)

下面是Server的NTILE输出的一个示例。

代码语言:javascript
复制
Bin |# Observations
1   26
2   26
3   26
4   26
5   26
6   26
7   26
8   25
9   25

这是熊猫:

代码语言:javascript
复制
Bin |# Observations
1   26
2   26
3   26
4   25 (Why is this 25 vs others?)
5   26
6   26
7   25 (Why is this 25 vs others?)
8   26
9   26
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-22 08:24:28

qcut的行为是这样的,因为它更精确。下面是一个示例:

对于i_th级别,它以分位数(_I-1)*10%开始:

代码语言:javascript
复制
import pandas as pd
import numpy as np

a = np.random.rand(26*10+3)
r = pd.qcut(a, 10)
np.bincount(r.labels)

产出如下:

代码语言:javascript
复制
array([27, 26, 26, 26, 27, 26, 26, 26, 26, 27])

如果您想要NTILE,您可以自己计算分数:

代码语言:javascript
复制
n = len(a)
ngroup = 10

counts = np.ones(ngroup, int)*(n//ngroup)
counts[:n%ngroup] += 1

q = np.r_[0, np.cumsum(counts / float(n))]
q[-1] = 1.0
r2 = pd.qcut(a, q)
np.bincount(r2.labels)

产出如下:

代码语言:javascript
复制
array([27, 27, 27, 26, 26, 26, 26, 26, 26, 26])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20726493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档