根据单个列对熊猫中的多个列进行排序

时间:2020-09-27 18:17:28

标签: 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”列是指“名称”列,而“ Exr_2”列是指“名称_2”列。

我正在尝试对数据框进行排序,如果“名称”列中的行与“名称_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行。

1 个答案:

答案 0 :(得分:0)

您可以将数据分为两个单独的数据帧,并使用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