重新排序数据框中的行以匹配另一个数据框中的行顺序

Reordering rows in a dataframe to match order of rows in another dataframe

我有 2 个数据帧 df1 和 df2,它们具有相同的行数但顺序不同。数据帧有一个 ID 列,其中包含每行的唯一标识符,两个数据帧都有这个 ID 列,这是我希望 df2 中的行顺序与 df1 匹配的列。我希望顺序相同的原因是数据帧将传递给 sklearn train_test_split 并且我希望以完全相同的顺序拆分数据帧。我该怎么做?

这是第一个数据帧:

df1

Paper ID          Document       Label 
math.123.txt    df1 content 1      0
math.321.txt    df1 content 2      0
math.213.txt    df1 content 3      0

df2

Paper ID         Document        Label 
math.123.txt     df2 content 1         0
math.213.txt     df2 content 2         0
math.321.txt     df2 content 3         0

df2 的所需顺序:

df2

Paper ID         Document            Label 
math.123.txt     df2 content 1         0
math.321.txt     df2 content 3         0
math.213.txt     df2 content 2         0

所以基本上我只想根据 df1["Paper ID"]

中的行顺序对 df2 中的行重新排序

由于要根据论文ID对数据帧进行排序,因此应首先将它们设置为两个数据帧中的索引:

df1.set_index('Paper ID', inplace=True)
df2.set_index('Paper ID', inplace=True)

现在您可以重新索引 df2 以匹配 df1 的顺序:

df2 = df2.reindex(df1.index)

最后,重置索引以恢复默认索引:

df1.reset_index(inplace=True)
df2.reset_index(inplace=True)

您可以使用 reindex 并使用 'Paper ID' 作为索引,这里是管道版本:

df2 = (df2.set_index('Paper ID')
          .reindex(df1.set_index('Paper ID').index)
          .reset_index()
       )

或者,如果您的值是唯一的,您可以尝试仅使用键列(未测试)对 df1 执行左连接:

pd.merge(df1[['Paper ID']], df2,
         how='left', on='Paper ID',
         sort=False
         )