通过分组有效地对DataFrame的一列进行改组

时间:2019-07-19 00:12:56

标签: python pandas

我正在尝试对大型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并就地解决此问题?

2 个答案:

答案 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很有帮助。