前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas | 数据筛选

Pandas | 数据筛选

作者头像
生信real
发布2022-12-20 09:29:02
1.2K0
发布2022-12-20 09:29:02
举报
文章被收录于专栏:Linux基础入门

本文框架

  • 0. 导入Pandas
  • 1. 数据读取与预处理
  • 2. 使用单个label值筛选数据
  • 3. 使用列表名批量筛选
  • 4. 使用区间进行范围筛选
  • 5. 使用条件表达式筛选
    • 5.1 简单条件表达式
    • 5.2 复杂条件筛选
    • 5.3 定义函数筛选

0. 导入Pandas

代码语言:javascript
复制
import pandas as pd

1. 数据读取与预处理

代码语言:javascript
复制
# 数据读取
data = pd.read_csv("./datas/03/Weather_2018.csv")
--------------------------------------------------------------------------------
# 查看前6行
data.head(6)
# 返回结果
          ymd bWendu yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel
0  2018-01-01     3℃    -6℃   晴~多云       东北风   1-2级   59       良         2
1  2018-01-02     2℃    -5℃   阴~多云       东北风   1-2级   49       优         1
2  2018-01-03     2℃    -5℃     多云        北风     1-2级   28       优         1
3  2018-01-04     0℃    -8℃      阴       东北风     1-2级   28       优         1
4  2018-01-05     3℃    -6℃   多云~晴       西北风   1-2级   50       优         1
5  2018-01-06     2℃    -5℃   多云~阴       西南风   1-2级   32       优         1
--------------------------------------------------------------------------------
# 设定索引为日期,方便按日期筛选。
# inplace:如果 True:操作在当前 DataFrame 上完成;如果 False:返回操作完成的副本
data.set_index("ymd",inplace=True)
--------------------------------------------------------------------------------
# 查看更改后的索引
data.index
# 返回结果
Index(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05',
       '2018-01-06', '2018-01-07', '2018-01-08', '2018-01-09', '2018-01-10',
       ..................
--------------------------------------------------------------------------------
# 查看更改索引后的前6行
data.head(6)
# 返回结果
           bWendu yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel
ymd                                                                    
2018-01-01     3℃    -6℃   晴~多云       东北风   1-2级   59       良         
2018-01-02     2℃    -5℃   阴~多云       东北风   1-2级   49       优         1
2018-01-03     2℃    -5℃     多云         北风    1-2级   28       优         1
2018-01-04     0℃    -8℃      阴         东北风   1-2级   28       优         1
2018-01-05     3℃    -6℃   多云~晴        西北风  1-2级   50       优         1
2018-01-06     2℃    -5℃   多云~阴        西南风  1-2级   32       优         1
--------------------------------------------------------------------------------
# 替换掉温度的后缀℃
# 先将数据转化成字符串,再将"℃"替换为空,最后再转化为数值
data["bWendu"] = data["bWendu"].str.replace("℃", "").astype("int32")
data["yWendu"] = data["yWendu"].str.replace("℃", "").astype("int32")
--------------------------------------------------------------------------------
# 查看转化后数据框
data.head()
# 返回结果
           bWendu  yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel
ymd                                                                      
2018-01-01       3      -6   晴~多云       东北风   1-2级   59       良         2
2018-01-02       2      -5   阴~多云       东北风   1-2级   49       优         1
2018-01-03       2      -5     多云        北风   1-2级   28       优         1
2018-01-04       0      -8      阴       东北风   1-2级   28       优         1
2018-01-05       3      -6   多云~晴       西北风   1-2级   50       优         1

2. 使用单个label值筛选数据

loc[]接受两个参数,并以","分隔;逗号前表示行,逗号后表示列。

代码语言:javascript
复制
# 查询单个值
data.loc["2018-01-03","bWendu"]
# 返回结果
2
--------------------------------------------------------------------------------
# 查询多个值,得到一个Series;多个值时要用中括号括起来。
data.loc["2018-01-03",["bWendu","yWendu"]]
# 返回结果
bWendu     2
yWendu    -5
Name: 2018-01-03, dtype: object

3. 使用列表名批量筛选

使用列表名筛选行和列中的多个ID时,需要用中括号将ID括起来;

如果筛选行或列的单个ID,则不需要使用中括号。

代码语言:javascript
复制
# 批量查询,得到DataFrame
data.loc[["2018-01-01","2018-01-03"],["bWendu","aqiLevel"]]
# 返回结果
            bWendu  aqiLevel
ymd                         
2018-01-01       3         2
2018-01-03       2         1
--------------------------------------------------------------------------------
# 批量查询,得到Series
data.loc[["2018-01-01","2018-01-03"],"bWendu"]
# 返回结果
ymd
2018-01-01    3
2018-01-03    2
Name: bWendu, dtype: int32

4. 使用区间进行范围筛选

使用区间筛选时,行和列的ID无需使用中括号括起来。

代码语言:javascript
复制
# 区间查询
data.loc["2018-01-01":"2018-01-03","bWendu":"fengxiang"]
# 返回结果
            bWendu  yWendu tianqi fengxiang
ymd                                        
2018-01-01       3      -6   晴~多云       东北风
2018-01-02       2      -5   阴~多云       东北风
2018-01-03       2      -5     多云        北风

5. 使用条件表达式筛选

使用条件表达式返回的是布尔数组。

5.1 简单条件表达式

筛选最高气温大于36摄氏度的天气。

代码语言:javascript
复制
# 简单条件表达式筛选
data.loc[data["bWendu"]>36,:] #等同于data.loc[data["bWendu"]>36]
# 返回值
            bWendu  yWendu  tianqi fengxiang fengli  aqi aqiInfo  aqiLevel
ymd                                                                       
2018-06-05      38      25      多云       西南风   4-5级   94       良         2
2018-06-27      37      25      多云       东北风   3-4级   54       良         2
2018-06-29      37      25       晴        南风   1-2级   59       良         2
2018-06-30      37      23  雷阵雨~多云       东南风   3-4级   81       良         2
2018-07-05      37      24  多云~雷阵雨       东南风   1-2级  104    轻度污染         3

5.2 复杂条件筛选

筛选最低气温大于15,最高气温小于30,且天气为晴的日期;

组合条件用&符号合并,每个条件判断都得带括号。

代码语言:javascript
复制
# 复杂条件表达式筛选
data.loc[(data["bWendu"]<30) & (data["yWendu"]>15) & (data["tianqi"]=="晴"),:]
# 返回结果
           bWendu  yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel
ymd                                                                      
2018-04-28      27      17      晴       西南风   3-4级  125    轻度污染         3
2018-09-07      27      16      晴       西北风   3-4级   22       优         1
2018-09-09      28      16      晴       西南风   1-2级   51       良         2

5.3 定义函数筛选

代码语言:javascript
复制
# 使用lambda表达式筛选
# 筛选最低气温大于15,最高气温小于30,且天气为晴的日期
data.loc[lambda df:(df["bWendu"]<30) & (df["yWendu"]>15) & (df["tianqi"]=="晴"),:]
# 返回结果
            bWendu  yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel
ymd                                                                      
2018-04-28      27      17      晴       西南风   3-4级  125    轻度污染         3
2018-09-07      27      16      晴       西北风   3-4级   22       优         1
2018-09-09      28      16      晴       西南风   1-2级   51       良         2
--------------------------------------------------------------------------------
# 自定义函数筛选
# 筛选2018年7月且aqiLevel=1的天气
def filter(df):
    return df.index.str.startswith("2018-07") & (df["aqiLevel"]==1)
data.loc[filter,:]
# 返回结果
            bWendu  yWendu  tianqi fengxiang fengli  aqi aqiInfo  aqiLevel
ymd                                                                       
2018-07-10      30      22  多云~雷阵雨        南风   1-2级   48       优         1
2018-07-11      25      22  雷阵雨~大雨       东北风   1-2级   44       优         1
2018-07-12      27      22      多云        南风   1-2级   46       优         1
2018-07-16      31      24  中雨~雷阵雨        南风   1-2级   43       优         1
2018-07-17      27      23  中雨~雷阵雨        西风   1-2级   28       优         1
2018-07-24      28      26  暴雨~雷阵雨       东北风   3-4级   29       优         1
2018-07-25      32      25      多云        北风   1-2级   28       优         1
2018-07-26      33      25  多云~雷阵雨       东北风   1-2级   40       优         1
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信百宝箱 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文框架
    • 0. 导入Pandas
      • 1. 数据读取与预处理
        • 2. 使用单个label值筛选数据
          • 3. 使用列表名批量筛选
            • 4. 使用区间进行范围筛选
              • 5. 使用条件表达式筛选
                • 5.1 简单条件表达式
                • 5.2 复杂条件筛选
                • 5.3 定义函数筛选
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档