Python Pandas - 如何获取数据帧中一个或多个已过滤行的(iloc)位置

问题描述 投票:1回答:1

使用这个例子

df = pd.DataFrame({'letters': 
                  ['A', 'B', 'C', 'D', 'E', 'F']},
                  index=[10, 20, 30, 40, 50, 30])

使用df.iloc [x]我可以得到数据帧中的行x。例如。

df.iloc[3]

回报

字母D名称:40,dtype:object

当我过滤数据帧时

df2 = df.iloc[1:3]

我得到的是df2

    letters
20  B
30  C

现在假设我不知道如何应用过滤器,我需要找出过滤行(1和2)的值。

获取位置列表的最佳方法是什么,允许我使用df.iloc通过原始数据框访问过滤结果?我如何获得位置编号?

我正在寻找结果

[1, 2]

注意:我有一个很好的建议:

df.index.get_indexer_for((df2.index))

如果索引不是唯一的,那么它不起作用。

Int64Index([1, 2, 5], dtype='int64')
python pandas dataframe
1个回答
0
投票

因为如果我们想要处理像df.iloc[[1,5]]这样的情况我们必须合并这个值,你需要从“30 F”获得5,我认为最简单的方法是利用合并:

In [172]: df.reset_index().reset_index().merge(df.iloc[1:3].reset_index())
Out[172]: 
   level_0  index letters
0        1     20       B
1        2     30       C

In [173]: df.reset_index().reset_index().merge(df.iloc[1:3].reset_index())["level_0"].values
Out[173]: array([1, 2], dtype=int64)

In [174]: df.reset_index().reset_index().merge(df.iloc[[1,5]].reset_index())
Out[174]: 
   level_0  index letters
0        1     20       B
1        5     30       F

In [175]: df.reset_index().reset_index().merge(df.iloc[[1,5]].reset_index())["level_0"].values
Out[175]: array([1, 5], dtype=int64)

如果由于重复行而无法唯一恢复原始位置,您将获得所有这些:

In [179]: df.iloc[-1, 0] = "C"

In [180]: df.reset_index().reset_index().merge(df.iloc[[1,2]].reset_index())
Out[180]: 
   level_0  index letters
0        1     20       B
1        2     30       C
2        5     30       C

In [181]: df.reset_index().reset_index().merge(df.iloc[[1,2]].reset_index())["level_0"].values
Out[181]: array([1, 2, 5], dtype=int64)

但您可以决定在合并后如何删除重复项。

© www.soinside.com 2019 - 2024. All rights reserved.