pd.cut令人困惑的结果

时间:2019-06-07 01:52:32

标签: python pandas range cut

我需要根据连续值创建范围,该范围的最小值为0,最大值为1990161。

我当时想创建5个等长的范围,因此应用“ pd.cut”并得到了结果。

pd.cut(df['v'], 5)
----------------------------------------------
[(-1990.161, 398032.2], (796064.4, 1194096.6], (398032.2, 796064.4], (1194096.6, 1592128.8], (1592128.8, 1990161.0]]
Categories (5, interval[float64]): [(-1990.161, 398032.2] < (398032.2, 796064.4] < (796064.4, 1194096.6] < (1194096.6, 1592128.8] < (1592128.8, 1990161.0]]

我期望的是“ pd.cut”使范围从实际值开始,因此最低范围应该从0开始。但是它是-1990.161。

我已经搜索了一些代码并尝试了此操作。

lower, higher = df['v'].min(), df['v'].max()
n_bins= 5
edges = range(lower, higher+5, int(round((higher - lower)/n_bins,0)))
lbs = ['(%d, %d]'%(edges[i], edges[i+1]) for i in range(len(edges)-1)]
pd.cut(df['v'], bins=n_bins, labels=lbs, include_lowest=True)
----------------------------------------------
Categories (5, object): [(0, 398032] < (398032, 796064] < (796064, 1194096] < (1194096, 1592128] < (1592128, 1990160]]

我认为有两个问题。 首先,标签似乎不正确... min(0)和max(1990161)所属的标签(0,398032]和(1592128,1990160]说,它不包括0,1990161,但那些值。

秒,刚刚添加的标签上方的代码无法调整范围的边界。这意味着结果与第一个代码的范围相同。

之所以使用“ pd.cut”是因为它会自动从值范围计算出相同的长度。

除了通过创建列表应用[0,3000,5000 ...]这样的bin之外,还有其他方法可以调整范围的边界吗?

也许我误解了“ pd.cut”的逻辑或结果,所以任何建议都将不胜感激。在此先感谢:)

1 个答案:

答案 0 :(得分:0)

通常,我们应该将垃圾箱减去并添加到minmax

binsize=df.v.ptp()//5
pd.cut(df['v'], bins=range(df.v.min()-binsize//5,df.v.max()+binsize,binsize), include_lowest=True)