熊猫中的置换群体

gongzhitaao

假设我有一个Pandas DataFrame其数据如下所示的

import numpy as np
import pandas as pd

n = 30
df = pd.DataFrame({'a': np.arange(n),
                   'b': np.random.choice([0, 1, 2], n),
                   'c': np.arange(n)})

问题:如何置换组(按b分组)?

不是每个组内的排列,而是组级上的排列?


例子

a b c
1 0 1
2 0 2
3 1 3
4 1 4
5 2 5
6 2 6

a b c
3 1 3
4 1 4
1 0 1
2 0 2
5 2 5
6 2 6

基本上在置换之前df['b'].unqiue() == [0, 1, 2],在置换之后,df['b'].unique() == [1, 0, 2]

sparc_spread

这是受此SO帖子的公认答案启发的答案,该帖子使用一个临时Categorical列作为排序键来进行自定义排序。在这个答案中,我产生了所有排列,但是如果您只寻找一个,则可以选择第一个。

import itertools

df_results = list()
orderings = itertools.permutations(df["b"].unique())
for ordering in orderings:
    df_2 = df.copy()
    df_2["b_key"] = pd.Categorical(df_2["b"], [i for i in ordering])
    df_2.sort_values("b_key", inplace=True)
    df_2.drop(["b_key"], axis=1, inplace=True)
    df_results.append(df_2)

for df in df_results:
    print(df)

这里的想法是,我们每次都创建一个新的类别变量,其枚举顺序略有不同,然后对其进行排序。一旦不再需要它,我们将在最后将其丢弃。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章