python - 如何在 Python 中自定义排序两个 pandas 数据框列?
问题描述
为一个模糊的标题道歉;希望我能更好地解释。我有一个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
最初的排序方式。对此自定义排序有何见解?
解决方案
您可以按列的唯一值使用有序分类df2['c2']
,因此DataFrame.sort_values
按c1
您需要的排序之后:
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
推荐阅读
- angular - Angular 通过输入中的 id 从数组中获取对象
- android - Android 模拟器没有与我的 React Native 应用程序一起运行
- postgresql - Odoo 12 数据库连接超时与繁重的 cron 作业
- eclipse - 如何将源文件链接到基于 Eclipse 的 IDE
- linux - 通过 ssh 连接到 jupyter notebook 服务器的问题
- pycharm - Python 社区:我们可以在社区版本中使用 BDD 框架吗?
- ios - 用新通知替换旧的 LOCAL 通知
- python - 是否有与 Python 的 xarray 等效的 Matlab?
- python - Pyspark:将分类列转换为二进制数组
- angular - mat-form-field' 不是 angular 中的已知元素