我正在尝试对大型Pandas数据框实施置换测试。数据框如下所示:
group some_value label
0 1 8 1
1 1 7 0
2 1 6 2
3 1 5 2
4 2 1 0
5 2 2 0
6 2 3 1
7 2 4 2
8 3 2 1
9 3 4 1
10 3 2 1
11 3 4 2
我想按列group
进行分组,并重新排列label
列并写回数据帧,最好是就地写。 some_value
列应保持不变。结果应类似于以下内容:
group some_value label
0 1 8 1
1 1 7 2
2 1 6 2
3 1 5 0
4 2 1 1
5 2 2 0
6 2 3 0
7 2 4 2
8 3 2 1
9 3 4 2
10 3 2 1
11 3 4 1
我使用了np.random.permutation
,但发现它非常慢。
df["label"] = df.groupby("group")["label"].transform(np.random.permutation
看来df.sample
更快。如何使用df.sample()
代替np.random.permutation
并就地解决此问题?
答案 0 :(得分:0)
我们可以使用sample
注意,这里假设df=df.sort_values('group')
df['New']=df.groupby('group').label.apply(lambda x : x.sample(len(x))).values
或者我们可以通过
df['New']=df.sample(len(df)).sort_values('group').New.values
答案 1 :(得分:0)
如何提供自定义转换功能?
def sample(x):
return x.sample(n=x.shape[0])
df.groupby("group")["label"].transform(sample)
打印出通过transform函数传递到自定义函数中的内容的SO explanation很有帮助。