首页 > 解决方案 > 根据单列对 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 行。

标签: pythonpandas

解决方案


您可以将数据拆分为两个单独的数据框并用于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

推荐阅读