Python Pandas 使用 pd.qcut 创建新的 Bin/Bucket 变量
Python Pandas Create New Bin/Bucket Variable with pd.qcut
如何使用 python 中的 pd.qut 创建新的 Bin/Bucket 变量?
这对于有经验的用户来说似乎很基础,但我对此不是很清楚,而且在堆栈上搜索 overflow/google 出人意料地不直观。一些彻底的搜索产生了这个 (Assignment of qcut as new column) 但它并没有完全回答我的问题,因为它没有采取最后一步并将所有东西放入垃圾箱(即 1,2,...)。
编辑:以下答案仅对 Pandas 小于 0.15.0 的版本有效。如果您 运行 Pandas 15 岁或更高,请参阅:
data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False)
感谢@unutbu 指出。 :)
假设您有一些数据要分箱,在我的例子中是期权价差,并且您想创建一个新变量,其中的桶对应于每个观察值。上面提到的 link 你可以通过:
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]
希望这对其他人有帮助。至少现在应该更容易搜索了。 :)
在 Pandas 0.15.0 或更新版本中,pd.qcut
将 return 一个系列,如果输入是一个系列(在您的情况下是这样)或如果 labels=False
。如果您设置 labels=False
,那么 qcut
将 return 一个以 bin 的整数指标作为值的系列。
因此,为了让您的代码面向未来,您可以使用
data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False)
或者,将 NumPy 数组传递给 pd.qcut
,这样您就可以得到一个分类值作为 return 值。
请注意,分类属性 labels
is deprecated。使用 codes
代替:
data3['bins_spd'] = pd.qcut(data3['spd_pct'].values, 5).codes
如何使用 python 中的 pd.qut 创建新的 Bin/Bucket 变量?
这对于有经验的用户来说似乎很基础,但我对此不是很清楚,而且在堆栈上搜索 overflow/google 出人意料地不直观。一些彻底的搜索产生了这个 (Assignment of qcut as new column) 但它并没有完全回答我的问题,因为它没有采取最后一步并将所有东西放入垃圾箱(即 1,2,...)。
编辑:以下答案仅对 Pandas 小于 0.15.0 的版本有效。如果您 运行 Pandas 15 岁或更高,请参阅:
data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False)
感谢@unutbu 指出。 :)
假设您有一些数据要分箱,在我的例子中是期权价差,并且您想创建一个新变量,其中的桶对应于每个观察值。上面提到的 link 你可以通过:
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]
希望这对其他人有帮助。至少现在应该更容易搜索了。 :)
在 Pandas 0.15.0 或更新版本中,pd.qcut
将 return 一个系列,如果输入是一个系列(在您的情况下是这样)或如果 labels=False
。如果您设置 labels=False
,那么 qcut
将 return 一个以 bin 的整数指标作为值的系列。
因此,为了让您的代码面向未来,您可以使用
data3['bins_spd'] = pd.qcut(data3['spd_pct'], 5, labels=False)
或者,将 NumPy 数组传递给 pd.qcut
,这样您就可以得到一个分类值作为 return 值。
请注意,分类属性 labels
is deprecated。使用 codes
代替:
data3['bins_spd'] = pd.qcut(data3['spd_pct'].values, 5).codes