使用 isin() 时如何维护原始数据帧索引并保持输入列表的顺序?

Posted

技术标签:

【中文标题】使用 isin() 时如何维护原始数据帧索引并保持输入列表的顺序?【英文标题】:How to maintain original dataframe index and keep order of input list when using isin()? 【发布时间】:2020-05-30 17:12:06 【问题描述】:

我有以下数据框: g= pd.DataFrame('A':[1,2,42,5,7],'B':[5,6,7,3,2])

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

我正在使用以下列表来过滤数据框:

list_values = [5,7,1]

并使用以下方法获得以下输出:

indexes = g[g['A'].isin(list_values)].index.values

输出

array([0, 3, 4], dtype=int64)

如何更改代码以使索引如下?

array([3, 4, 0], dtype=int64)

本质上,我正在寻找一种方法来过滤带有列表的 DF,并按照过滤器列表的顺序返回原始索引值。

谢谢!

我查看了这个,但没有找到我要找的东西: Select rows of pandas dataframe from list, in order of list

【问题讨论】:

@ALollz - 我想没关系。重要的是保持不丢失原始索引值并以与 list_values 相同的顺序返回列表。 np.array([g.loc[g.A==i].index[0] for i in list_values]) 仅在“A”中的值是唯一的并且列表中的所有元素都存在于“A”中时才有效 @Asettisriharsha - 效果很好,谢谢! 【参考方案1】:

您可以使用有序的CategoricalDtype 来强制执行自定义排序顺序。排序后返回 5、7、1 的所有索引。

import pandas as pd

my_cat = pd.CategoricalDtype(categories=list_values, ordered=True)
#CategoricalDtype(categories=[5, 7, 1], ordered=True)

g.loc[g['A'].isin(list_values), 'A'].astype(my_cat).sort_values().index
#Int64Index([3, 4, 0], dtype='int64')

【讨论】:

我试过这个但得到AttributeError: module 'pandas' has no attribute 'CategoricalDtype'你使用的是哪个版本? @DavidCollins 0.25.0。我很确定它自从像0.21.0 这样的旧版本以来就已经存在。 太好了,谢谢!我使用的是 0.20.3。从来没有看到更新的理由。现在我做到了,并且做到了:1.0.1

以上是关于使用 isin() 时如何维护原始数据帧索引并保持输入列表的顺序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 isin(list) 过滤数据帧时出现“ValueError:列必须与键长度相同”

如何在每个组上应用功能并保持相同形状的数据框

如何在 Scala 中连接两个数据帧并通过索引从数据帧中选择几列?

pandas transform小结

pandas transform小结

如何在 Hive 中对文件进行重复数据删除并保持原始排序顺序?