difference between cut and qcut pandas

86

df['ext price'].value_counts(bins=4, sort=False)

#res
(55603.988000000005, 87998.212]     5
(87998.212, 120263.375]            12
(120263.375, 152528.538]            2
(152528.538, 184793.7]              1
Name: ext price, dtype: int64
pd.interval_range(start=0, freq=10000, end=200000, closed='left')

#res
IntervalIndex([[0, 10000), [10000, 20000), [20000, 30000), [30000, 40000), [40000, 50000) ... [150000, 160000),
[160000, 170000), [170000, 180000), [180000, 190000), [190000, 200000)],
              closed='left',
              dtype='interval[int64]')
interval_range = pd.interval_range(start=0, freq=10000, end=200000)
df['cut_ex2'] = pd.cut(df['ext price'], bins=interval_range, labels=[1,2,3])
df.head()

#There is a downside to using interval_range . You can not define custom labels.
pd.cut(df['ext price'], bins=4).value_counts() #bin range size afre equal

#res
(87998.212, 120263.375]     12 #different no. of observation
(55603.989, 87998.212]       5
(120263.375, 152528.538]     2
(152528.538, 184793.7]       1
Name: ext price, dtype: int64

#If you want equal distribution of the items in your bins, use qcut . If you want to define your own numeric bin ranges, then use cut .
\
df['quantile_ex_4'] = pd.qcut(df['ext price'],
                            q=[0, .2, .4, .6, .8, 1],  #quartiles bin range will vary
                            labels=False,     #returns integers as categories
                            precision=0)
df.head()
#all bins will have roughly same no. of observation

Comments

Submit
0 Comments