Pandas | 数据筛选

2022-12-20 09:29:02 浏览数 (2)

本文框架

  • 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

0 人点赞