我有一个包含3列的Dataframe - location_id,customers,cluster。 以前,我将数据聚集到5个集群中。因此,簇列包含值[0,1,2,3,4]。
我想将每个群集分成2个切片,以便进行下一个测试阶段。例如。 50-50片,或30-70片,或20-80片。
问题 - 如何应用添加列的功能
data.groupby('cluster')
?
理想的结果
location_id customers cluster slice
0 149213 132817 1 1
1 578371 76655 1 0
2 91703 74048 2 1
3 154868 62397 2 1
4 1022759 59162 2 0
更新
@ MaxU的解决方案让我走上了正确的道路。该解决方案涉及使用dataframe.assign函数添加新列,并检查当前索引/总索引长度以分配正确比例的切片。但是,下面的代码不知何故对我不起作用。我最终将@ MaxU的解决方案拆分为单独的步骤,并且有效。
testgroup= (data.groupby('cluster')
.apply(lambda x: x.assign(index1=(np.arange(len(x))))
))
testgroup= (testgroup.groupby('cluster')
.apply(lambda x: x.assign(total_len=len(x))
))
testgroup['is_slice'] = ((testgroup['index1']/testgroup['total_len']) <= 0.5)
location_id customers cluster index1 total_len is_slice
0 149213 132817 1 0 12 True
1 578371 76655 1 1 12 True
2 91703 74048 1 2 12 True
3 154868 62397 1 3 12 True
4 1022759 59162 1 4 12 True
5 87016 58134 1 5 12 True
6 649432 56849 1 6 12 False
7 219163 56802 1 7 12 False
8 97704 54718 1 8 12 False
9 248455 52806 1 9 12 False
10 184828 52783 1 10 12 False
11 152887 52565 1 11 12 False
答案 0 :(得分:1)
试试这个:
让你的样本DF变大:
In [31]: df = pd.concat([df] * 3, ignore_index=True)
In [32]: df
Out[32]:
location_id customers cluster
0 149213 132817 1
1 578371 76655 1
2 91703 74048 2
3 154868 62397 2
4 1022759 59162 2
5 149213 132817 1
6 578371 76655 1
7 91703 74048 2
8 154868 62397 2
9 1022759 59162 2
10 149213 132817 1
11 578371 76655 1
12 91703 74048 2
13 154868 62397 2
14 1022759 59162 2
切片30-70:
In [34]: (df.groupby('cluster')
...: .apply(lambda x: x.assign(slice=((np.arange(len(x))/len(x)) <= 0.3).astype(np.uint8)))
...: .reset_index(level=0, drop=True)
...: )
...:
Out[34]:
location_id customers cluster slice
0 149213 132817 1 1
1 578371 76655 1 1
5 149213 132817 1 0
6 578371 76655 1 0
10 149213 132817 1 0
11 578371 76655 1 0
2 91703 74048 2 1
3 154868 62397 2 1
4 1022759 59162 2 1
7 91703 74048 2 0
8 154868 62397 2 0
9 1022759 59162 2 0
12 91703 74048 2 0
13 154868 62397 2 0
14 1022759 59162 2 0
切片20-80:
In [35]: (df.groupby('cluster')
...: .apply(lambda x: x.assign(slice=((np.arange(len(x))/len(x)) <= 0.2).astype(np.uint8)))
...: .reset_index(level=0, drop=True)
...: )
...:
Out[35]:
location_id customers cluster slice
0 149213 132817 1 1
1 578371 76655 1 1
5 149213 132817 1 0
6 578371 76655 1 0
10 149213 132817 1 0
11 578371 76655 1 0
2 91703 74048 2 1
3 154868 62397 2 1
4 1022759 59162 2 0
7 91703 74048 2 0
8 154868 62397 2 0
9 1022759 59162 2 0
12 91703 74048 2 0
13 154868 62397 2 0
14 1022759 59162 2 0