基于python pandas中另一个连续变量创建分类变量的最有效方法是什么?

时间:2015-06-09 16:42:33

标签: pandas

我的数据框中有一个连续变量A(比如收入)。我想制作一个分类变量B.具体来说,我想将第二个变量定义为以500为增量上升,直到达到一定限度。例如,

B= 1 if A<500
   2 if A>=500 & A<1000
   3 if A>=1000 & A<1500
   ....
   11 if A>5000

Pandas最有效的方法是什么?在我主要编程的STATA中,如果我有很多类别,我会使用replace和if(繁琐)或循环。我想在使用熊猫时突破STATA思维,但有时我的想象力有限。

提前致谢

1 个答案:

答案 0 :(得分:1)

如果间隔是规则的并且值似乎是示例中的正值,则可以获取值的整数部分除以间隔的长度。像

这样的东西
df['category'] = (df.A / step_size).astype(int) 

请注意,如果存在负值,则可能会遇到问题,例如介于-500和500之间的任何东西都是0.但你可以通过在分割之前添加一些基本值来解决这个问题。您可以有效地将您的捕捉定义为步长的倍数,从某个基值开始,恰好是零以上。 像

这样的东西
df['category'] = ((df.A + base) / step_size).astype(int) 

此处&#39;另一种方法,用于间隔不规则的间隔:

lims = np.arange(500, 5500, 500)
df['category'] = 0
for lim in lims: 
    df.category += df.A > lim

当你的限制数量相对较少时,这种方法很好,但很明显,这种方法会减慢很多。 以下是各种方法的基准测试:

a = np.random.rand(100000) * 6000
%timeit pd.cut(a, 11)
%timeit (a / 500).astype(int)
100 loops, best of 3: 6.47 ms per loop
1000 loops, best of 3: 1.12 ms per loop

%%timeit
x = 0
for lim in lims: 
    x += a > lim
100 loops, best of 3: 3.84 ms per loop

我将pd.cut放在那里以及John E's建议。这会产生分类变量而不是整数,因为他指出它们有不同的用途。两种方法都有利弊,最好的方法取决于方案。