熊猫:按范围对列值进行分类

时间:2017-10-28 13:52:09

标签: python pandas dataframe

我有一个数据帧,df喜欢这个

a  b  c
1  0  2
5  7  8
4  1  3
3  4  6
5  2  5
.......

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

0-3 = 1
4-6 = 2
7-9 = 3

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

我想用范围类别替换上面的数据帧值,输出应该是这样的

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,依此类推。 我怎么能这样做?

3 个答案:

答案 0 :(得分:6)

pd.cutapply一起使用,即

df.apply(lambda x : pd.cut(x,[-1,3,6,9],labels=[1,2,3]))
   a  b  c
0  1  1  1
1  2  3  3
2  2  1  1
3  1  2  2
4  2  1  2

@coldspeed建议的基于非应用的解决方案:

pd.DataFrame(pd.cut(df.values.reshape(-1,),[-1,3,6,9],labels=[1,2,3]).codes.reshape(df.shape)+1,columns=df.columns)

pd.DataFrame(pd.cut(np.hstack(df.values),[-1,3,6,9],labels=[1,2,3]).codes.reshape(df.shape)+1,columns=df.columns)

答案 1 :(得分:4)

使用一点mathemagic:

((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全部用一个零(唯一要处理的角落情况)然后除以。

(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

答案 2 :(得分:2)

您可以使用np.digitize

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

或作为

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