• pandas行筛选/列筛选(条件筛选/范围筛选)/计算


    筛选行

    一、过滤机制 dataframe[ 条件 ]

    可以按照下列方法,依据列的值过滤DataFrame处理某些符合条件的行

    dataframe[ dataframe["colname"] > value ]
    dataframe[ dataframe["colname"] < value ]
    dataframe[ dataframe["colname"] != value ]
    

    二、推导过程

    boolean_array =   dataframe["colname"] > value         ————>   Series type with bool values
    dataframe[boolean_array]                               —————>  DataFrame filtered
    dataframe[ dataframe["colname"] > value ]              —————>  DataFrame filtered
    

    三、多条件过滤

    dataframe[ dataframe["col1"] > val1 & dataframe["col2"] != val2] 
    

    四、举例

    1、从记录中选出所有fault_code列的值在fault_list= [487, 479, 500, 505]这个范围内的记录
    record2=record[record['FAULT_CODE'].isin(fault_list)]

    要用.isin 而不能用in,用 in以后选出来的值都是True 和False,然后报错:
    ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any()

    2、选出所有WTGS_CODE=20004013的记录

    set=20004013
    record= record[record['WTGS_CODE'] == set]
    


    要点:
    (1)多个条件筛选的时候每个条件都必须加括号。
    (2)判断值是否在某一个范围内进行筛选的时候需要使用DataFrame.isin()的isin()函数,而不能使用in。

    3、using DataFrame.apply, which applies a function along a given axis,

    df = pandas.DataFrame(np.random.randn(5, 3), columns=['a', 'b', 'c'])
    df: 
              a         b         c
    0 -0.001968 -1.877945 -1.515674
    1 -0.540628  0.793913 -0.983315
    2 -1.313574  1.946410  0.826350
    3  0.015763 -0.267860 -2.228350
    4  0.563111  1.195459  0.343168
    
    df[df.apply(lambda x: x['b'] > x['c'], axis=1)]
    Out: 
              a         b         c
    1 -0.540628  0.793913 -0.983315
    2 -1.313574  1.946410  0.826350
    3  0.015763 -0.267860 -2.228350
    4  0.563111  1.195459  0.343168
    

    or
    mask = df.apply(lambda row: row["col"].val < 100, axis=1)
    df[mask]

    筛选列

    从DataFrame里选择几个特定的列来组成新的df

    假设,df有 col1-col20 一共20列,如果要从中选取几列组成新的df:
    df = [[col1,col2,col3,col4]]   #注意要用双括号
    
    假设df有两种columns名称, 一个是中文的col1,一个是英文的col2
    可以把col1和col2先做成字典(不能有重复的),如下:
    col_dict = dict(zip(col1,col2))
    
    use_col = [c1,c2,c3,c4...]  #假设挑出来c1-c4..几列来做过滤,要找对其对应的英文的列名:
    use_col_en = []
    #对于use_col里每一个i,在字典col_dict中遍历得到相应的value,再添加到新的列表中,就得到了use_col_en
    for i in use_col:
        v = col_dict[i]
        use_col_en.append(v)
        
    df_new = df[use_col_en]      #使用use_col_en来过滤原表
    df_new.columns = use_col      #将列名也替换
    

    Dataframe 计算

    两个df相加(次序忽略,结果相同)

    df_new = df1.add(df2,fill_value=0).fillna(0)
    

    单个df按条件配号

    import numpy as np
    conditions = [c1,c2,c3,c4,c5,c6]      #其中,c1-c6是布尔表达式
    values = [1,2,3,4,5,6]
    df[column] = np.select(conditions, values)
    
  • 相关阅读:
    CentOS 6.3 安装过程
    thinkphp的学习笔记
    全栈工程师之路
    Anne pro 2 开箱实录
    IDEA创建SpringBoot项目整合JPA,连接Oracle数据库,使用Swagger进行测试
    AOP思想的一点想法
    STS(Eclipse)修改Project Exploer背景颜色及字体大小
    IDEA运行Tomcat,控制台日志乱码
    MyBatis自动生成实体类、DAO和XML映射文件,并去掉实体类中的getter和setter方法
    vue+jspdf+html2canvas导出PDF文件
  • 原文地址:https://www.cnblogs.com/treasury-manager/p/13956651.html
Copyright © 2020-2023  润新知