2017-04-15 55 views
1

因此,我有两组功能,我希望装箱(分类),然后组合以创建新功能。这与将地图上的坐标分类成网格无异。熊猫的二维装仓

问题是功能不是均匀分布的,我想在binning时使用分位数(如pandas.qcut())在这两个功能/坐标上。

有没有比两个功能上的更好的方法,然后连接结果标签?

+0

我想不出任何。这似乎是绝对适合的方式。只有更好的是有一个内置函数。 – piRSquared

+0

我错了...还有什么我想要更好 – piRSquared

+0

我在等待认真... –

回答

1

创建一个笛卡尔产品分类。

考虑数据框df

df = pd.DataFrame(dict(A=np.random.rand(20), B=np.random.rand(20))) 

      A   B 
0 0.538186 0.038985 
1 0.185523 0.438329 
2 0.652151 0.067359 
3 0.746060 0.774688 
4 0.373741 0.009526 
5 0.603536 0.149733 
6 0.775801 0.585309 
7 0.091238 0.811828 
8 0.504035 0.639003 
9 0.671320 0.132974 
10 0.619939 0.883372 
11 0.301644 0.882258 
12 0.956463 0.391942 
13 0.702457 0.099619 
14 0.367810 0.071612 
15 0.454935 0.651631 
16 0.882029 0.015642 
17 0.880251 0.348386 
18 0.496250 0.606346 
19 0.805688 0.401578 

我们可以创建新的categoricals与pd.qcut

d1 = df.assign(
    A_cut=pd.qcut(df.A, 2, labels=[1, 2]), 
    B_cut=pd.qcut(df.B, 2, labels=list('ab')) 
) 

      A   B A_cut B_cut 
0 0.538186 0.038985  1  a 
1 0.185523 0.438329  1  b 
2 0.652151 0.067359  2  a 
3 0.746060 0.774688  2  b 
4 0.373741 0.009526  1  a 
5 0.603536 0.149733  1  a 
6 0.775801 0.585309  2  b 
7 0.091238 0.811828  1  b 
8 0.504035 0.639003  1  b 
9 0.671320 0.132974  2  a 
10 0.619939 0.883372  2  b 
11 0.301644 0.882258  1  b 
12 0.956463 0.391942  2  a 
13 0.702457 0.099619  2  a 
14 0.367810 0.071612  1  a 
15 0.454935 0.651631  1  b 
16 0.882029 0.015642  2  a 
17 0.880251 0.348386  2  a 
18 0.496250 0.606346  1  b 
19 0.805688 0.401578  2  b 

您可以创建笛卡尔乘积分类与元组

d2 = d1.assign(cartesian=pd.Categorical(d1.filter(regex='_cut').apply(tuple, 1))) 
print(d2) 

      A   B A_cut B_cut cartesian 
0 0.538186 0.038985  1  a (1, a) 
1 0.185523 0.438329  1  b (1, b) 
2 0.652151 0.067359  2  a (2, a) 
3 0.746060 0.774688  2  b (2, b) 
4 0.373741 0.009526  1  a (1, a) 
5 0.603536 0.149733  1  a (1, a) 
6 0.775801 0.585309  2  b (2, b) 
7 0.091238 0.811828  1  b (1, b) 
8 0.504035 0.639003  1  b (1, b) 
9 0.671320 0.132974  2  a (2, a) 
10 0.619939 0.883372  2  b (2, b) 
11 0.301644 0.882258  1  b (1, b) 
12 0.956463 0.391942  2  a (2, a) 
13 0.702457 0.099619  2  a (2, a) 
14 0.367810 0.071612  1  a (1, a) 
15 0.454935 0.651631  1  b (1, b) 
16 0.882029 0.015642  2  a (2, a) 
17 0.880251 0.348386  2  a (2, a) 
18 0.496250 0.606346  1  b (1, b) 
19 0.805688 0.401578  2  b (2, b) 

如果您如此倾向,您甚至可以为他们申报订单。

+0

看起来不错。谢谢!如果没有其他挑战者出现,将在合理的时间范围内接受这个答案。 –

+0

@ReubenL。别客气 – piRSquared