如何使用pd.qcut在python中创建新的Bin/Bucket变量?
对于有经验的用户来说,这可能很基础,但对我而言并不是非常清楚,并且在Stack Overflow/Google上搜索结果出人意料地不直观。通过仔细搜索,我找到了这个(Assignment of qcut as new column),但它并没有完全回答我的问题,因为它没有把所有内容放入Bin(例如1,2,...)。
如何使用pd.qcut在python中创建新的Bin/Bucket变量?
对于有经验的用户来说,这可能很基础,但对我而言并不是非常清楚,并且在Stack Overflow/Google上搜索结果出人意料地不直观。通过仔细搜索,我找到了这个(Assignment of qcut as new column),但它并没有完全回答我的问题,因为它没有把所有内容放入Bin(例如1,2,...)。
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
编辑:以下答案仅适用于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]
将所有内容放在一起:
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]