使用 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:列必须与键长度相同”