首页 > 解决方案 > 如何在 Python 中自定义排序两个 pandas 数据框列?

问题描述

为一个模糊的标题道歉;希望我能更好地解释。我有一个pandasDataFrame df(按 排序c1):

c1       c2
A        A
A        D
A        E
B        C
B        D
C        E
C        G
D        C
D        F
E        A
E        D
E        F
F        C
F        E
F        G
G        A
G        B
G        D
G        G

我想要排序的方式dfc1对单个值进行排序,然后收集该值的所有对应c2值,然后按这些值c1排序c1。换句话说,

c1          c2
A           A
A           D (*)
A           E (**)
D (*)       C (***)
D           F (****)
E (**)      A
E           D
E           F
C (***)     E
C           G (*****)
F (****)    C
F           E
F           G
G (*****)   A
G           B (******)
G           D
G           G
B (******)  C
B           D

我使用 *s 作为指标。在这里,您可以看到它c1是按出现的顺序按元素排序的c2

我首先尝试将两列排序在一起,

df = df.sort_values(by = ["c1", "c2"])

或在对它们进行不同排序后重新索引,

df.reindex(pd.DataFrame(np.sort(df.values,1)).sort_values([0,1]).index)

并且还尝试过压缩它们,

df['c1', 'c2'] = [list(x) for x in zip(*sorted(zip(df["c1"], df["c2"]), key=lambda pair: pair[0]))]

但似乎没有一种方法能提供我想要的东西。它们只是将外观相同的 DataFrame 传递给df最初的排序方式。对此自定义排序有何见解?

标签: pythonpandasdataframe

解决方案


您可以按列的唯一值使用有序分类df2['c2'],因此DataFrame.sort_valuesc1您需要的排序之后:

df['c1'] = pd.CategoricalIndex(df['c1'], ordered=True, categories=df['c2'].unique())
df = df.sort_values(by = "c1")
print (df)
0   A  A
1   A  D
2   A  E
8   D  F
7   D  C
11  E  F
10  E  D
9   E  A
5   C  E
6   C  G
17  G  D
15  G  A
16  G  B
18  G  G
12  F  C
13  F  E
14  F  G
4   B  D
3   B  C

如果可能某些值c1不存在c2(例如F1更改的样本数据中的值),那么解决方案会有点不同:

print (df)
    c1 c2
0    A  A
1    A  D
2    A  E
3    B  C
4    B  D
5    C  E
6    C  G
7    D  C
8    D  F
9    E  A
10   E  D
11   E  F
12   F  C
13  F1  E
14  F1  G
15   G  A
16   G  B
17   G  D
18   G  G

union = df[['c2','c1']].unstack().drop_duplicates()
print (union)
c2  0      A
    1      D
    2      E
    3      C
    6      G
    8      F
    16     B
c1  13    F1
dtype: object

df['c1'] = pd.CategoricalIndex(df['c1'], ordered=True, categories=union)
df = df.sort_values(by = "c1")
print (df)
    c1 c2
0    A  A
1    A  D
2    A  E
8    D  F
7    D  C
11   E  F
10   E  D
9    E  A
5    C  E
6    C  G
17   G  D
15   G  A
16   G  B
18   G  G
12   F  C
4    B  D
3    B  C
13  F1  E
14  F1  G

推荐阅读