Python 有效地获取区间类别的右边缘

Python 有效地获取区间类别的右边缘,python,pandas,indexing,categorical-data,Python,Pandas,Indexing,Categorical Data,如何有效地获得正确的边?在下面的示例中,如何高效地创建z 将熊猫作为pd导入,numpy作为np导入 bins=pd.间隔\范围(开始=0,结束=4,频率=1,关闭='left') x=pd系列(np.linspace(0.0,3.8,num=20)) y=局部切割(x,料仓) #如何有效地创建z? z=pd.系列(y.iat[n]。范围(len(y))内n的右侧) 谢谢你的帮助 对于性能方法,您可以使用: 对于pd.系列: pd.Series(np.digitize(x, range(0,4

如何有效地获得正确的边?在下面的示例中,如何高效地创建
z

将熊猫作为pd导入,numpy作为np导入
bins=pd.间隔\范围(开始=0,结束=4,频率=1,关闭='left')
x=pd系列(np.linspace(0.0,3.8,num=20))
y=局部切割(x,料仓)
#如何有效地创建z?
z=pd.系列(y.iat[n]。范围(len(y))内n的右侧)

谢谢你的帮助

对于性能方法,您可以使用:

对于
pd.系列

pd.Series(np.digitize(x, range(0,4)), index=x.index)

0     1
1     1
2     1
3     1
4     1
5     1
6     2
7     2
8     2
9     2
10    2
11    3
...

较大数据帧上的计时-

bins = pd.interval_range(start=0, end=400, freq=1, closed='left')
x = pd.Series(np.linspace(0.0,380,num=20_000))

%timeit pd.Series(np.digitize(x, range(0,400)))
# 567 µs ± 28.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

def op(x):
    y = pd.cut(x, bins)
    z = pd.Series(y.iat[n].right for n in range(len(y)))

%timeit op(x)
# 682 ms ± 49.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
如果两者给出相同的结果:

np.allclose(op(x), pd.Series(np.digitize(x, range(0,400))))
# True

因此,对于20000行的大得多的数据帧,我们得到了1200x的加速,这是没有效率的。我的真实数据大约有1000亿行。它必须是一个矢量化的操作,不涉及python级别的循环。那么pandas听起来不是你@S.V的最佳选择。也许numpy会更好。numpy获得正确边缘的方法对我来说很好:-)这对@S.V有帮助吗别忘了你可以投票并接受答案。看,谢谢!我已将您的编辑转向以下问题:
IntervalIndex
的一侧可以使用
left
right
方法有效地接收,但这不是这里的任务。
np.allclose(op(x), pd.Series(np.digitize(x, range(0,400))))
# True