Home Articles

Python Pandas:获取列匹配特定值的行的索引

Asked
Viewed 951 times
151

给定一个带有“BoolCol”列的DataFrame,我们想要找到DataFrame的索引,其中“BoolCol”的值== True

我目前有迭代的方式来做到这一点,它完美地工作:

for i in range(100,3000):
    if df.iloc[i]['BoolCol']== True:
         print i,df.iloc[i]['BoolCol']

但这不是正确的熊猫方式 . 经过一些研究,我目前正在使用此代码:

df[df['BoolCol'] == True].index.tolist()

这个给了我一个索引列表,但是当我通过执行以下操作检查它们时它们不匹配:

df.iloc[i]['BoolCol']

结果实际上是假的!!

这是正确的熊猫方式吗?

2 Answers

  • 241

    df.iloc[i] 返回 dfith 行 . i 不引用索引标签, i 是基于0的索引 .

    相比之下, the attribute index returns actual index labels ,而不是数字行索引:

    df.index[df['BoolCol'] == True].tolist()
    

    或等效地,

    df.index[df['BoolCol']].tolist()
    

    通过使用带有“异常”索引的DataFrame,您可以非常清楚地看到差异:

    df = pd.DataFrame({'BoolCol': [True, False, False, True, True]},
           index=[10,20,30,40,50])
    
    In [53]: df
    Out[53]: 
       BoolCol
    10    True
    20   False
    30   False
    40    True
    50    True
    
    [5 rows x 1 columns]
    
    In [54]: df.index[df['BoolCol']].tolist()
    Out[54]: [10, 40, 50]
    

    If you want to use the index

    In [56]: idx = df.index[df['BoolCol']]
    
    In [57]: idx
    Out[57]: Int64Index([10, 40, 50], dtype='int64')
    

    then you can select the rows using loc instead of iloc

    In [58]: df.loc[idx]
    Out[58]: 
       BoolCol
    10    True
    40    True
    50    True
    
    [3 rows x 1 columns]
    

    注意 loc can also accept boolean arrays

    In [55]: df.loc[df['BoolCol']]
    Out[55]: 
       BoolCol
    10    True
    40    True
    50    True
    
    [3 rows x 1 columns]
    

    If you have a boolean array, mask, and need ordinal index values, you can compute them using np.flatnonzero

    In [110]: np.flatnonzero(df['BoolCol'])
    Out[112]: array([0, 3, 4])
    

    使用 df.iloc 按顺序索引选择行:

    In [113]: df.iloc[np.flatnonzero(df['BoolCol'])]
    Out[113]: 
       BoolCol
    10    True
    40    True
    50    True
    
  • 15

    可以使用numpy where()函数完成:

    import pandas as pd
    import numpy as np
    
    In [716]: df = pd.DataFrame({"gene_name": ['SLC45A1', 'NECAP2', 'CLIC4', 'ADC', 'AGBL4'] , "BoolCol": [False, True, False, True, True] },
           index=list("abcde"))
    
    In [717]: df
    Out[717]: 
      BoolCol gene_name
    a   False   SLC45A1
    b    True    NECAP2
    c   False     CLIC4
    d    True       ADC
    e    True     AGBL4
    
    In [718]: np.where(df["BoolCol"] == True)
    Out[718]: (array([1, 3, 4]),)
    
    In [719]: select_indices = list(np.where(df["BoolCol"] == True)[0])
    
    In [720]: df.iloc[select_indices]
    Out[720]: 
      BoolCol gene_name
    b    True    NECAP2
    d    True       ADC
    e    True     AGBL4
    

    虽然您并不总是需要匹配索引,但如果您需要,请填写:

    In [796]: df.iloc[select_indices].index
    Out[796]: Index([u'b', u'd', u'e'], dtype='object')
    
    In [797]: df.iloc[select_indices].index.tolist()
    Out[797]: ['b', 'd', 'e']
    

Related