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


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

对于有经验的用户来说,这似乎是最基本的,但我对此并不十分清楚,搜索堆栈溢出/谷歌是非常不直观的。一些彻底的搜索产生了这个(将qcut分配为新列)但它并没有完全回答我的问题,因为它没有采取最后一步并把所有东西放入箱子(即1,2,......)。


8368
2018-02-10 22:20


起源



答案:


在Pandas 0.15.0或更新版本中, pd.qcut 如果输入是一个系列(就像你的情况那样)或者如果输入,将返回一个系列而不是一个分类 labels=False。如果你设置 labels=False, 然后 qcut 将返回一个以二进制数的整数指示符作为值的系列。

因此,为了使您的代码能够面向未来,您可以使用

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

或者,将NumPy数组传递给 pd.qcut 所以你得到一个分类作为返回值。 请注意Categorical属性 labels 已弃用。使用 codes 代替:

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

8
2018-02-10 22:56



大!我没有意识到这一点。谢谢你指出来。 - sfortney


答案:


在Pandas 0.15.0或更新版本中, pd.qcut 如果输入是一个系列(就像你的情况那样)或者如果输入,将返回一个系列而不是一个分类 labels=False。如果你设置 labels=False, 然后 qcut 将返回一个以二进制数的整数指示符作为值的系列。

因此,为了使您的代码能够面向未来,您可以使用

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

或者,将NumPy数组传递给 pd.qcut 所以你得到一个分类作为返回值。 请注意Categorical属性 labels 已弃用。使用 codes 代替:

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

8
2018-02-10 22:56



大!我没有意识到这一点。谢谢你指出来。 - sfortney


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

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

感谢@unutbu指出它。 :)

假设你有一些你想要bin的数据,在我的情况下选项传播,你想要用每个观察对应的桶创建一个新变量。上面提到的链接你可以通过以下方式完成:

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]

希望这有助于其他人。至少现在应该更容易搜索。 :)


4
2018-02-10 22:20