zoukankan      html  css  js  c++  java
  • Python基础 | pandas中数据的筛选(index & subset)

    参考资料
    pandas Indexing and selecting data

    本文数据可在此处下载,密码:vwy3

    # 加载数据
    import pandas as pd
    
    # 数据是之前在cnblog上抓取的部分文章信息
    df = pd.read_csv('./data/SQL测试用数据_20200325.csv',encoding='utf-8')
    
    df.head(3)
    

    筛选列

    相当于SQL中的select

    所有列

    • df
    • df[:]

    某一列

    • df.col_name 列名必须是字符串格式且不含空格
    • df['col_name']
    • 第N列,
      • df.iloc[:,[1,3,4]]
      • 先获取列名列表,再指定index,df[df.columns[0]]

    选择多列

    • 指定列名称,df['col_1','col_2'],或者 df.loc[:,['col_1','col_2']]
    • 指定列顺序,df[df.columns[1,3,4]]df.iloc[:,[1,3,4]]
    • 列名称符合某种规则,比如相同的前缀,那么可以先得到列名称,然后进行判断筛选相应的列名
      • df.filter(regex='^h') 以h开头的字段名称对应的列
    df.filter(regex='^h')
    

    筛选行

    相当于SQL中的where

    按行的顺序

    • 前3行,df_data.head(3)
    • 后3行,df_data.tail(3)
    • 指定index,
      • 选择行df.iloc[:3] 和head(3)的效果是一样的
      • 选择列 df.iloc[:,:3] 选择前3列
      • 单元格定位 df.iloc[0,1] 选择第1行第2列的单元格数值
      • 选择区域,df.iloc[[:3],[:3]] 前3行,前3列
    • 指定行index,df.loc[[row_index],[col_names]]
    # 选择前3行
    df.iloc[:3]
    
    # 选取列 href的数据,只取index为1,3,5的数据,
    df.loc[[1,3,5],['href']]
    

    抽样(行)

    df.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

    • n 样本数量
    • frac 比例
    • replace 是否放回,一般是无放回抽样(函数默认值)
    • weight 权重
    # 随机抽取3行数据
    df.sample(n=3)
    
    # 随机抽5‰的行
    df.sample(frac=0.005)
    

    最大(小)值

    # 阅读量最低的5篇文章的信息
    df.nsmallest(5,'read_cnt')
    
    # 阅读量最高的5篇文章的信息
    df.nlargest(5,'read_cnt')
    

    按值的判断

    • 字符串匹配,包括精确匹配模糊匹配
    • 数值区间

    =,>,<(值的比较)

    # 筛选博客名称为'wupeixuan'的行
    # 注意对标题字母统一转成小写
    df[df['blog_name'] == 'wupeixuan']
    
    # .query方法
    df.query('blog_name == "wupeixuan"')
    
    # 阅读数大于5000的文章信息
    df[df['read_cnt'] > 5000]
    
    # 阅读量在1000-5000这个区间的文章数量
    df[(df['read_cnt'] >= 1000) & (df['read_cnt'] <= 5000)].shape[0]
    
    # .query方法
    df.query('1000 <= read_cnt <= 5000').shape[0]
    

    输出:
    65

    df.query看起来和sql更相似,也更直观

    该方法对于如下操作是有效的:

    • =,>,< ==
    • and,or and, or, &, |
    • not 只能应用到bool值的列
    • in,not in in, not in

    注意点:

    • 字符串取值要用双引号
    • 逻辑关键字

    and,or,not(或且非)

    # 星期1发布且(&)阅读量>5000的文章
    df[(df['weekday']==1) & (df['read_cnt']>5000)]
    
    df.query('weekday==1 and read_cnt>5000')
    
    df.query('weekday==1 & read_cnt>5000')
    
    # 标题中含有'5000' 或(|) 阅读量>5000的文章
    df[(df['title'].str.contains('5000')) | (df['read_cnt']>5000)]
    
    # 不看阅读量<5000的文章
    # 也就是只看阅读量>=5000的文章
    df[~(df['read_cnt']<5000)]
    

    like(字符串匹配)

    包含某字符,相当于SQL中的%like%

    # 筛选标题中含有‘Jupyter’的行
    # 如果是英文字母可以考虑对标题字母统一转成小写或大写
    df[df['title'].str.contains('Jupyter')]
    
    # 字符串的正则匹配
    
    # 筛选标题中同时含有'Python'和'数据分析'的行
    df[df['title'].apply(lambda x:x.lower()).str.contains('python.*数据分析')]
    
    # 筛选标题中含有'Kmeans'或'梯度下降'的行
    df[df['title'].str.contains('Kmeans|梯度下降')]
    
    
    # 组合用法
    
    df[df['title'].str.contains('机器学习.*(Kmeans|梯度下降)')]
    

    in(取值的集合)

    # in
    # 阅读量刚好是333或者999的文章信息
    df[df['read_cnt'].isin([333,999])]
    
    # query方法
    df.query('read_cnt in [333,999]')
    
    # not in 
    # ~ 和 .isin组合集合
    
    # 只看星期天的发文数量
    df[~df['weekday'].isin([1,2,3,4,5,6])].shape[0]
    
    df.query('weekday not in [1,2,3,4,5,6]').shape[0]
    

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    转载请注明作者及出处

  • 相关阅读:
    maven
    Web开发入门
    网络编程之Socket
    自定义注解与设计模式
    数据交换格式与SpringIOC底层实现
    caffe笔记之例程学习(二)
    caffe笔记之例程学习
    ubuntu14.04 caffe环境配置
    Pattern Recognition (Fourth Edition)读书笔记之mvnrnd函数
    MIF文件编写小技巧
  • 原文地址:https://www.cnblogs.com/dataxon/p/12566447.html
Copyright © 2011-2022 走看看