【问题标题】:confusing result from pd.cutpd.cut 的结果令人困惑
【发布时间】: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”的逻辑或结果,所以任何建议都将不胜感激。在此先感谢:)

【问题讨论】:

    标签: python pandas range cut


    【解决方案1】:

    通常我们应该在 minmax 中减去和添加 bin

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      相关资源
      最近更新 更多