如何使用pd.cut以自然的方式存储数据?

时间:2018-03-23 06:28:44

标签: python pandas

假设我有一个100系列浮动数据点的熊猫系列,我需要将它们放入10个相同宽的垃圾箱中,我需要访问第四个垃圾箱中的数据索引。那我尝试的是:

import pandas as pd; import numpy as np
np.random.seed(1)
s = pd.Series(np.random.randn(100))
cut = pd.cut(s, bins=10, labels=range(10))
fourth_bin = s[cut == 4]
fourth_bin
Out[101]: 
9    -0.249370
12   -0.322417
13   -0.384054
16   -0.172428
26   -0.122890
28   -0.267888
31   -0.396754
40   -0.191836
51   -0.352250
53   -0.349343
54   -0.208894
63   -0.298093
65   -0.075572
71   -0.504466
76   -0.306204
80   -0.222328
81   -0.200758
92   -0.375285
96   -0.343854
dtype: float64

这不太自然,看起来甚至有点笨拙。例如,我可以避免手动设置labels并从pd.cut(s, bins=10)开始吗?这样我想做一些像

这样的事情
s[s in pd.cut(s, bins=10).categories[4]]

因为categoriesInterval的列表,但这不起作用。

有没有更自然的方法来执行此操作,因此我不必手动设置labels

1 个答案:

答案 0 :(得分:1)

pd.qcut

对于大小均匀的垃圾箱

np.random.seed(1)
s = pd.Series(np.random.randn(100))

cut = pd.qcut(s, 10, labels=False)
fourth_bin = s[cut == 4]

fourth_bin

16   -0.172428
18    0.042214
26   -0.122890
35   -0.012665
40   -0.191836
44    0.050808
54   -0.208894
65   -0.075572
81   -0.200758
97    0.043597
dtype: float64

pd.cut

对于均匀间隔的箱子

np.random.seed(1)
s = pd.Series(np.random.randn(100))

cut = pd.cut(s, 10, labels=False)
fourth_bin = s[cut == 4]
fourth_bin

9    -0.249370
12   -0.322417
13   -0.384054
16   -0.172428
26   -0.122890
28   -0.267888
31   -0.396754
40   -0.191836
51   -0.352250
53   -0.349343
54   -0.208894
63   -0.298093
65   -0.075572
71   -0.504466
76   -0.306204
80   -0.222328
81   -0.200758
92   -0.375285
96   -0.343854
dtype: float64