按给定列表的顺序选择重复的熊猫数据框行,并保留原始索引

时间:2020-07-30 09:27:14

标签: python pandas dataframe

在查看herehere之后,在文档中,我仍然找不到一种方法来根据 all 这些条件从DataFrame中选择行:

  • 以给定列的值列表中给定的顺序返回行
  • 返回重复的行(与列表中的重复值相关联)
  • 保留原始索引
  • 忽略DataFrame中不存在的列表的值

举个例子,

df = pd.DataFrame({'A': [5, 6, 3, 4], 'B': [1, 2, 3, 5]})
df

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

让我们

list_of_values = [3, 4, 6, 4, 3, 8]

然后我想获取以下数据框:

     A   B
2    3   3
3    4   5
1    6   2
3    4   5
2    3   3

我该怎么做? Zero's answer看起来很有希望,因为它是我发现的唯一保留原始索引的索引,但它不适用于重复项。关于如何修改/概括它的任何想法?

2 个答案:

答案 0 :(得分:1)

这是一种使用merge来做到这一点的方法:

list_df = pd.DataFrame({"A": list_of_values, "order": range(len(list_of_values))})

pd.merge(list_df, df, on="A").sort_values("order").drop("order", axis=1)

输出为:

   A  B
0  3  3
2  4  5
4  6  2
3  4  5
1  3  3

答案 1 :(得分:1)

我们必须通过首先将index分配为一列来保留它,以便在合并后可以set_index

list_of_values = [3, 4, 6, 4, 3, 8]
df2 = pd.DataFrame({'A': list_of_values, 'order': range(len(list_of_values))})

dfn = (
    df.assign(idx=df.index)
    .merge(df2, on='A')
    .sort_values('order')
    .set_index('idx')
    .drop('order', axis=1)
)

     A  B
idx      
2    3  3
3    4  5
1    6  2
3    4  5
2    3  3

如果要删除索引名称(idx),请使用rename_axis

dfn = dfn.rename_axis(None)

   A  B
2  3  3
3  4  5
1  6  2
3  4  5
2  3  3