如何在Python中自定义对两个熊猫数据框列的排序?

时间:2019-10-28 06:23:09

标签: python pandas dataframe

道歉含糊不清;希望我能做得更好。我有一个pandas DataFrame 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

我要如何对df进行排序是对单个值进行c1排序,然后为该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最初的排序方式。关于此自定义排序有什么见解?

1 个答案:

答案 0 :(得分:3)

您可以按df2['c2']列的唯一值来使用ordered categoricals,因此c1的{​​{3}}之后可以按需要进行排序:

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

如果可能,{{1}中不存在来自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