我的数据框中有一个连续变量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思维,但有时我的想象力有限。
提前致谢
答案 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
建议。这会产生分类变量而不是整数,因为他指出它们有不同的用途。两种方法都有利弊,最好的方法取决于方案。