cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False) 需要将数据值分段并排序到bins中时使用cut。 此函数对于从连续变量转换为离散变量也很有用。 例如,cut可以将年龄转换为年龄范围组。 支持bins到相同数量的箱柜或预先指定的bins阵列。 x: 进行划分的一维数组 bins : 1,整数---将x划分为多少个等间距的区间
In[1]:pd.cut(np.array([0.2,1.4,2.5,6.2,9.7,2.1]),3,retbins=True)
Out[1]: ([(0.19, 3.367], (0.19, 3.367], (0.19, 3.367], (3.367,6.533],
(6.533,9.7], (0.19, 3.367]] Categories (3, interval[float64]):
[(0.19,3.367] < (3.367, 6.533] < (6.533, 9.7]],array([ 0.1905 , 3.36666667, 6.53333333, 9.7 ]))
print(pd.cut(np.array([0.2,1.4,2.5,6.2,9.7,2.1]),3,retbins=False))
# [(0.19, 3.367], (0.19, 3.367], (0.19, 3.367], (3.367, 6.533], (6.533, 9.7],
(0.19, 3.367]]Categories (3, interval[float64]):
[(0.19, 3.367] < (3.367, 6.533] < (6.533, 9.7]]
2,序列—将x划分在指定的序列中,若不在该序列中,则是NaN
In[2]:pd.cut(np.array([0.2,1.4,2.5,6.2,9.7,2.1]),[1,2,3],retbins=True)
Out[2]: ([NaN, (1, 2], (2, 3], NaN, NaN, (2, 3]]
Categories(2, interval[int64]): [(1, 2] < (2, 3]], array([1, 2, 3]))
right : 是否包含右端点 labels : 是否用标记来代替返回的bins
In[3]:pd.cut([1,2,3,4],4,labels=['one','two','three','four'])
Out[3]: [one, two, three, four]
Categories (4, object): [one <two < three < four]
retbins: 是否返回间距bins precision: 精度 include_lowest:是否包含左端点 返回值: 如果retbins = False 则返回x中每个值对应的bin的列表,否者则返回x中每个值对应的bin的列表和对应的bins
qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise') 基于分位数的离散化功能。 根据等级或基于样本分位数将变量分离为相等大小的桶。 例如,10个分位数的1000个值将产生一个分类对象,表示每个数据点的分位数成员资格。
两者的区别:
rng=np.random.RandomState(42)
factors = rng.randn(30)
print(factors)
print('='*30)
print(pd.cut(factors, 5).value_counts())
print('='*30)
print(pd.qcut(factors, 5).value_counts())
# (-1.917, -1.215] 4 # (-1.215, -0.516] 6 # (-0.516, 0.182] 10 # (0.182, 0.881] 7 # (0.881, 1.579] 3 # dtype: int64 # ============================== # (-1.914, -0.929] 6 # (-0.929, -0.464] 6 # (-0.464, -0.0559] 6 # (-0.0559, 0.506] 6 # (0.506, 1.579] 6 # dtype: int64
首先是观察上面的数据, 先分析qcut()函数:qcut(factors, 5),当你用qcut求五分之一时,将选择这些规则选择bins:使你在每个bins里有相同数量的记录。 你有30个记录,所以每个bin应该有6个(你的输出应该是这样的,尽管断点会因随机抽取而不同).这样就是结果中每个分组里面均有6个数存在的原因。 cut()函数:因为cut()会根据值本身而不是这些值的频率选择均匀分布的bins(在本例中直接将bins分成5份)。 因此,因为随机生成一个正态分布数据,你会看到靠近均值bins中的频率更高,外部更少。 这基本上是一个直方图的表格形式。 从上面的分析即可得出qcut()和cut()的区别。