我有一个数据框中的一列数字,我想把这些数字分为高、低、排除等类别。我该如何实现这个目标呢?我很困惑,我试过使用cut函数和category数据类型,但不知道怎么操作。
我有一个数据框中的一列数字,我想把这些数字分为高、低、排除等类别。我该如何实现这个目标呢?我很困惑,我试过使用cut函数和category数据类型,但不知道怎么操作。
使用pd.cut
的一个简短示例。
我们从一些数据框开始:
df = pd.DataFrame({'A': [0, 8, 2, 5, 9, 15, 1]})
假设我们想将数字分配到以下类别中:'low'
表示数字在区间[0, 2]
内,'mid'
表示数字在区间(2, 8]
内,'high'
表示数字在区间(8, 10]
内,我们排除10以上(或0以下)的数字。
因此,我们有3个具有边缘值的箱子:0、2、8、10。现在,我们可以使用cut
如下:
pd.cut(df['A'], bins=[0, 2, 8, 10], include_lowest=True)
Out[33]:
0 [0, 2]
1 (2, 8]
2 [0, 2]
3 (2, 8]
4 (8, 10]
5 NaN
6 [0, 2]
Name: A, dtype: category
Categories (3, object): [[0, 2] < (2, 8] < (8, 10]]
参数 include_lowest=True
包括第一个区间的左端点。(如果你想要右侧开放的区间,则使用 right=False
。)
可能不是最好的方案,将区间名称改为low/mid/high
:
pd.cut(df['A'], bins=[0, 2, 8, 10], include_lowest=True, labels=['low', 'mid', 'high'])
Out[34]:
0 low
1 mid
2 low
3 mid
4 high
5 NaN
6 low
Name: A, dtype: category
Categories (3, object): [low < mid < high]
被排除的数字15会被赋予“类别”NaN
。如果你喜欢更有意义的名称,可能最简单的解决方案(还有其他处理NaN的方法)是添加另一个区间(bin)和一个类别名称,例如:
pd.cut(df['A'], bins=[0, 2, 8, 10, 1000], include_lowest=True, labels=['low', 'mid', 'high', 'excluded'])
Out[35]:
0 low
1 mid
2 low
3 mid
4 high
5 excluded
6 low
Name: A, dtype: category
Categories (4, object): [low < mid < high < excluded]
http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing
或者你可以研究一下numpy.where
import numpy as np
df['is_high'] = np.where(df.['column_of_interest'] > 5 ,1,0)
high = result['Traded Value'] > 2.983150e+09
,接着 print result[high]
输出的结果符合我的期望(显示大于该值的数字)。然后我尝试将结果添加到我的数据框中的新列中,使用 result = result.assign(high=high.values)
,但是当我显示数据框时,这个新列变成了布尔值,而不是数值型的数值……让我很困惑,不知道该怎么办。 - Nathaniel Babalola
cut
应该可以胜任这个工作。你可以将bins
(箱子边缘)的数组和箱子的labels
传递给它。在文档中有一个例子。 - ptrjcut
函数,但是感到很困惑,无法理解。 - Nathaniel Babalola