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

Posted

技术标签:

【中文标题】按给定列表的顺序选择重复的熊猫数据框行并保留原始索引【英文标题】:Select rows of pandas dataframe in order of a given list with repetitions and keep the original index 【发布时间】:2020-11-20 00:30:09 【问题描述】:

查看here 和here 并在文档中,我仍然找不到根据所有这些标准从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]

那我想得到如下DataFrame:

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

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

【问题讨论】:

【参考方案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

【讨论】:

我对列有缩进问题,但查看 A 和 B - 似乎与您要查找的内容相同。 问题不在列,而在索引。【参考方案2】:

我们必须先将index 分配为列来保留它,这样我们才能在mering 之后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

【讨论】:

谢谢,这确实有效。至于重命名索引,我想dfn.index = dfn.index.rename("") 也可以,但肯定更冗长。

以上是关于按给定列表的顺序选择重复的熊猫数据框行并保留原始索引的主要内容,如果未能解决你的问题,请参考以下文章

根据两列的值选择熊猫数据框行

按时间戳列过滤/选择熊猫数据帧的行

如何在保留顺序的同时删除列表中的重复元素?

Python:将字典附加到熊猫数据框行

熊猫过滤具有特定年份的数据框行

Mapreduce - 保留输入顺序