在数据框中对一个列的数据进行分类。

9

我有一个数据框中的一列数字,我想把这些数字分为高、低、排除等类别。我该如何实现这个目标呢?我很困惑,我试过使用cut函数和category数据类型,但不知道怎么操作。


没有,我必须使用NumPy吗?我认为Pandas应该可以做到。 - Nathaniel Babalola
抱歉,我在回答后删除了评论。是的,你可以使用pandas。 - draco_alpine
如果我理解正确,cut 应该可以胜任这个工作。你可以将 bins(箱子边缘)的数组和箱子的 labels 传递给它。在文档中有一个例子。 - ptrj
我之前确实看过cut函数,但是感到很困惑,无法理解。 - Nathaniel Babalola
2个回答

25

使用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]

我现在明白这个例子了,非常有帮助。祝福。 - Nathaniel Babalola

1

好的,我会检查一下。虽然我认为Pandas应该能够在不使用NumPy的情况下完成它。 - Nathaniel Babalola
我检查过了,我的输出是布尔值,然后我执行了以下操作:high = result['Traded Value'] > 2.983150e+09,接着 print result[high] 输出的结果符合我的期望(显示大于该值的数字)。然后我尝试将结果添加到我的数据框中的新列中,使用 result = result.assign(high=high.values),但是当我显示数据框时,这个新列变成了布尔值,而不是数值型的数值……让我很困惑,不知道该怎么办。 - Nathaniel Babalola
使用我提供的文档中的数据,您可以使用以下代码:df['A_column_high_values'] = df.A[df['A']>10]。这将为您提供一个列,其中包含'A'的值(如果大于10)和NaN(否则)。 - draco_alpine
是的,它是不同的,但当我提出问题时,我从未知道我的输出将是布尔值,实际上在添加新列时需要数值。 - Nathaniel Babalola
所以我认为第二条评论会满足你的需求。 - draco_alpine
显示剩余2条评论

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