假设我有一个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]
。
这是受此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] 删除。
我来说两句