代码之家  ›  专栏  ›  技术社区  ›  576i

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

  •  1
  • 576i  · 技术社区  · 7 年前

    用这个例子

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

    具有 df。伊洛克 [x] 我可以得到数据框中的x行。例如

    df.iloc[3]
    

    返回

    字母D 名称:40,数据类型:object

    当我像这样过滤数据帧时

    df2 = df.iloc[1:3]
    

    我得到了df2

        letters
    20  B
    30  C
    

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

    获取位置列表的最佳方法是什么,它允许我通过原始数据帧使用 df。伊洛克 ? 我如何获得职位编号?

    我在寻找结果

    [1, 2]
    

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

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

    如果索引不是唯一的,这就不起作用。

    Int64Index([1, 2, 5], dtype='int64')
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   DSM    7 年前

    因为如果我们想处理这样的案件,我们也必须考虑到这些价值 df.iloc[[1,5]] ,你需要从“30F”中得到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)
    

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