【问题标题】:How to maintain original dataframe index and keep order of input list when using isin()?使用 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 - 效果很好,谢谢!

标签: python pandas indexing


【解决方案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
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2019-07-18
  • 2016-02-09
相关资源
最近更新 更多