DataFrame筛选出指定列值的行

需求


对于一个DataFrame,常常需要筛选出某列为指定值的行。

pandas中获取数据的有以下几种方法:

  • 布尔索引
  • 位置索引
  • 标签索引
  • 使用API
  • 假设df数据如下:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'code': '000001.SZ 000002.SZ 000006.SZ 000009.SZ'.split(),
                       'open': '1.2 20 3.5 2.8'.split(),
                       'close': np.arange(4), 
                       'high': np.arange(4) * 2})
    

    数据如下:

    >>> df
            code open  close  high
    0  000001.SZ  1.2      0     0
    1  000002.SZ   20      1     2
    2  000006.SZ  3.5      2     4
    3  000009.SZ  2.8      3     6
    

    问题如下:

    1. 找出code为指定值的行
    2. 找出open>3的行
    3. 找出

    布尔索引


    找出符合条件的所有行,即条件判断bool值为true,如找出code为000002.SZ的行:

    df[df['code'] == '000002.SZ'] # 判断等式是否成立
    

    这会列出所有使得条件 df[‘code’] == ‘000002.SZ’ 为true的所有行,输出如下:

    >>> df[df['code'] == '000002.SZ']
            code open  close  high
    1  000002.SZ   20      1     2
    

    位置索引


    使用iloc方法,根据索引的位置来查找数据的。这个例子需要先找出符合条件的行所在位置。

    mask = df['code'] == '000002.SZ'
    pos = np.flatnonzero(mask)
    df.iloc[pos]
    
    # 直接根据索引取值
    df.iloc[1:2]
    

    输出与之前相同。

    标签索引


    适用于DataFrame的行列都是有标签的情形。

    如:

    # 把要操作的列作为索引
    df.index=df['code'] # 将code列作为DataFrame的行索引
    df.loc['000002.SZ', :] # 注意,这种根据索引iloc得到的结果不是DataFrame类型,而是Series
    
    # 使用布尔
    df.loc[df['code']=='000002.SZ']
    

    结果如下:

    >>> df.loc['000002.SZ', :]
    code     000002.SZ
    open            20
    close            1
    high             2
    Name: 000002.SZ, dtype: object
    >>>
    >>> df.loc[df['code']=='000002.SZ']
                    code open  close  high
    code
    000002.SZ  000002.SZ   20      1     2
    

    使用API


    适用于数据量比较大的情形,方法为:pd.DataFrame.query。

    如:

    df.query('code=="000002.SZ"')
    
    # 多条件
    df.query('code=="000002.SZ" | code=="000006.SZ"')
    

    结果如下:

    >>> df.query('code=="000002.SZ"')
                    code open  close  high
    code
    000002.SZ  000002.SZ   20      1     2
    >>>
    >>> # 多条件
    >>> df.query('code=="000002.SZ" | code=="000006.SZ"')
                    code open  close  high
    code
    000002.SZ  000002.SZ   20      1     2
    000006.SZ  000006.SZ  3.5      2     4
    

    小结


    除了上面判断相等的情况,也可以结合条件判断一起使用。

    1. 筛选出列值属于某个范围内的行,用isin:df.loc[df['column_name'].isin(some_values)] # some_values是可迭代对象
    2. 多种条件限制时使用&,&的优先级高于>=或<=,所以要注意括号的使用: df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
    3. 筛选出列值不等于某个/些值的行:
    df.loc[df['column_name'] != 'some_value']
    
    df.loc[~df['column_name'].isin('some_values')] #~取反
    

    df功能强大,且用且总结。

    参考

    https://www.cnblogs.com/small-bud/p/12380357.html

    来源:guotianqing

    物联沃分享整理
    物联沃-IOTWORD物联网 » DataFrame筛选出指定列值的行

    发表回复