道歉含糊不清;希望我能做得更好。我有一个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
最初的排序方式。关于此自定义排序有什么见解?
答案 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