【发布时间】:2019-06-07 01:52:32
【问题描述】:
我需要从具有最小值 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”的逻辑或结果,所以任何建议都将不胜感激。在此先感谢:)
【问题讨论】: