首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:按范围分类列值

熊猫:按范围分类列值
EN

Stack Overflow用户
提问于 2017-10-28 13:52:09
回答 2查看 5.3K关注 0票数 5

我有这样的数据

代码语言:javascript
复制
a  b  c
1  0  2
5  7  8
4  1  3
3  4  6
5  2  5
.......

现在,我想用以下范围替换这些数据

代码语言:javascript
复制
0-3 = 1
4-6 = 2
7-9 = 3

列值小于10,因此范围在0-9之内。

我想用范围类别替换上面的dataframe值,输出应该如下所示

代码语言:javascript
复制
a  b  c
1  1  1
2  3  3
2  1  1
1  2  2
2  1  2
.......

因此,如果df中的任何值在0-3以内,则应该用1替换,如果4-6内有任何值,则替换为2,依此类推。我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2017-10-28 13:59:25

用一个小数学:

代码语言:javascript
复制
((df - 1) // 3).clip(0) + 1

   a  b  c
0  1  1  1
1  2  3  3
2  2  1  1
3  1  2  2
4  2  1  2

或者,用一个(需要处理的唯一角的情况)来replace所有的零,然后再进行除法。

代码语言:javascript
复制
(df.replace(0, 1) - 1) // 3 + 1

   a  b  c
0  1  1  1
1  2  3  3
2  2  1  1
3  1  2  2
4  2  1  2
票数 4
EN

Stack Overflow用户

发布于 2017-10-28 13:59:05

您可以使用np.digitize

代码语言:javascript
复制
In [5942]: bins = np.array([0, 4, 7, 10])

In [5943]: pd.DataFrame(np.digitize(df, bins), columns=df.columns)
Out[5943]:
   a  b  c
0  1  1  1
1  2  3  3
2  2  1  1
3  1  2  2
4  2  1  2

或作为

代码语言:javascript
复制
In [5947]: bins2 = np.array([-1, 3, 6, 9])

In [5948]: pd.DataFrame(np.digitize(df, bins2, right=True), columns=df.columns)
Out[5948]:
   a  b  c
0  1  1  1
1  2  3  3
2  2  1  1
3  1  2  2
4  2  1  2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46990467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档