python - 根据单列对 pandas 中的多列进行排序
问题描述
我有以下数据框:
df1:
Name Tis Exr Name_2 Exr_2
A1FH derm 3.4 GHJK brn:2.4
N4RT lng 0.1 PP2DS Lvr:3.4;hup:2.3
GHJK Pap 2.2 KLM3 tet:2.0
4HHR stm 1.4 LSDR NaN
PP2DS skl 3.7 PMRT van:3.7;epth:23.5
LSDR lym 2.1 exty NaN
2BC4 lym 4.4 NaN NaN
本质上,列“Tis”和“Exr”指的是“Name”列,而“Exr_2”列指的是“Name_2”列。
我正在尝试对数据框进行排序,如果“Name”列中的一行与“Name_2”列中的一行匹配,那么它们将被移动到同一行 - 上面列中的数据也是如此。保留不匹配的行,但在不匹配的行中列为 NaN。我希望按字母顺序执行此操作。
期望的输出:
df2:
Name Tis Exr Name_2 Exr_2
GHJK Pap 2.2 GHJK brn:2.4
LSDR lym 2.1 LSDR NaN
PP2DS skl 3.7 PP2DS Lvr:3.4;hup:2.3
2BC4 lym 4.4 NaN NaN
4HHR stm 1.4 NaN NaN
A1FH derm 3.4 NaN NaN
NaN NaN NaN exty NaN
NaN NaN NaN KLM3 tet:2.0
N4RT lng 0.1 NaN NaN
NaN NaN NaN PMRT van:3.7;epth:23.5
我尝试了许多不同的事情:
df1 = pd.read_csv('dataset.csv', error_bad_lines=False, sep = '\t')
df2 = df1.sort_values(['Name', 'Name_2'], ascending =[False, True])
试过:
df1[df1.Name==df1.Name_2]
我也尝试在 Linux 命令行上使用各种工具,但使用 Pandas 似乎更好,因为我更熟悉 Python。
我拥有的数据框超过 41,000 行。
解决方案
您可以将数据拆分为两个单独的数据框并用于df.merge
匹配名称。
df2 = df1[['Name', 'Tis', 'Exr']].sort_values('Name')
df_temp = df1[['Name_2', 'Exr_2']]
df2 = df2.merge(df_temp, left_on='Name', right_on='Name_2', how='outer')
del df_temp
print(df2)
输出
Name Tis Exr Name_2 Exr_2
0 2BC4 lym 4.4 NaN NaN
1 4HHR stm 1.4 NaN NaN
2 A1FH derm 3.4 NaN NaN
3 GHJK Pap 2.2 GHJK brn:2.4
4 LSDR lym 2.1 LSDR NaN
5 N4RT lng 0.1 NaN NaN
6 PP2DS skl 3.7 PP2DS Lvr:3.4;hup:2.3
7 NaN NaN NaN KLM3 tet:2.0
8 NaN NaN NaN PMRT van:3.7;epth:23.5
9 NaN NaN NaN exty NaN
10 NaN NaN NaN NaN NaN
推荐阅读
- r - R:在加载的包中找不到函数
- reactjs - React:如果我实施了修复,为什么我仍然会收到唯一的 key prop 警告?
- c++ - Xlib:多线程的分段错误
- c++ - 如何创建#define 值的向量?
- java - 如何使用毕加索单击按钮将图像保存到存储中?
- php - Symfony Mgilet 通知 Bundle 处理事件
- c# - .Net MVC C# - 读取文件时间过长
- javascript - regex condition not working on polymer paper-input, how to allow only decimal on paper input?
- python - 在带有 OAuth2 代码的 python 中使用 Dropbox API 的问题
- sql-server - SQL Server 中的批量加载无法加载浮点值