Python Pandas使用pd.qcut创建新的Bin/Bucket变量

12

如何使用pd.qcut在python中创建新的Bin/Bucket变量?

对于有经验的用户来说,这可能很基础,但对我而言并不是非常清楚,并且在Stack Overflow/Google上搜索结果出人意料地不直观。通过仔细搜索,我找到了这个(Assignment of qcut as new column),但它并没有完全回答我的问题,因为它没有把所有内容放入Bin(例如1,2,...)。

2个回答

8
在Pandas 0.15.0或更新版本中,如果输入为一个Series(如在您的情况下),或者设置labels=False,则pd.qcut将返回一个Series而不是Categorical。如果设置了labels=False,那么qcut将返回一个带有bin的整数指示器作为值的Series。因此,为了使代码具有未来可扩展性,您可以使用以下方法:
data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False)

或者,将NumPy数组传递给pd.qcut,以便将分类数据作为返回值。请注意,分类属性labels已被弃用。请改用codes

data3['bins_spd'] = pd.qcut(data3['spd_pct'].values, 5).codes

太好了!我不知道那个。谢谢你指出来。 - sfortney

5

编辑:以下答案仅适用于Pandas版本低于0.15.0。如果您正在运行Pandas 15或更高版本,请参见:

data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False)

感谢@unutbu指出。 :)

假设你有一些数据需要分组,例如我的情况是期权价差,你想创建一个新变量,将每个观测值对应到相应的桶中。上面提到的链接说可以这样做:

print pd.qcut(data3['spd_pct'], 40)

(0.087, 0.146]
(0.0548, 0.087]
(0.146, 0.5]
(0.146, 0.5]
(0.087, 0.146]
(0.0548, 0.087]
(0.5, 2]

这将为您提供与每个观察值对应的bin端点。然而,如果您想要每个观察值对应的bin编号,则可以执行以下操作:

print pd.qcut(data3['spd_pct'],5).labels

[2 1 3 ..., 0 1 4] 

如果您想创建一个只包含bin数的新变量,可以使用以下代码实现:

将所有内容放在一起:

data3['bins_spd']=pd.qcut(data3['spd_pct'],5).labels

print data3.head()

   secid      date    symbol  symbol_flag     exdate   last_date cp_flag  0   5005  1/2/1997  099F2.37            0  1/18/1997         NaN       P   
1   5005  1/2/1997  09B0B.1B            0  2/22/1997   12/3/1996       P   
2   5005  1/2/1997  09B7C.2F            0  2/22/1997  12/11/1996       P   
3   5005  1/2/1997  09EE6.6E            0  1/18/1997  12/27/1996       C   
4   5005  1/2/1997  09F2F.CE            0  8/16/1997         NaN       P   

   strike_price  best_bid  best_offer     ...      close  volume_y    return  0          7500     2.875      3.2500     ...        4.5     99200  0.074627   
1         10000     5.375      5.7500     ...        4.5     99200  0.074627   
2          5000     0.625      0.8750     ...        4.5     99200  0.074627   
3          5000     0.125      0.1875     ...        4.5     99200  0.074627   
4          7500     3.000      3.3750     ...        4.5     99200  0.074627   

   cfadj_y  open  cfret  shrout      mid   spd_pct  bins_spd  
0        1   4.5      1   57735  3.06250  0.122449         2  
1        1   4.5      1   57735  5.56250  0.067416         1  
2        1   4.5      1   57735  0.75000  0.333333         3  
3        1   4.5      1   57735  0.15625  0.400000         3  
4        1   4.5      1   57735  3.18750  0.117647         2  

[5 rows x 35 columns]

希望这能帮助其他人。至少现在搜索会更容易了。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接