Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
04. Pandas查询数据
python
Pandas
数据分析
pythonPandas数据分析
panjw@dp.tech
Python导师蚂蚁
更新于 2024-08-12
推荐镜像 :Basic Image:ubuntu:22.04-py3.10-cuda12.1
推荐机型 :c2_m4_cpu
04. Pandas查询数据
Pandas查询数据的几种方法
Pandas使用df.loc查询数据的方法
注意
0、读取数据
1、使用单个label值查询数据
2、使用值列表批量查询
3、使用数值区间进行范围查询
4、使用条件表达式查询
简单条件查询,最低温度低于-10度的列表
复杂条件查询,查一下我心中的完美天气
5、调用函数查询

04. Pandas查询数据

今天没有漂亮的PPT,只有干货!!

Pandas查询数据的几种方法

  1. df.loc方法,根据行、列的标签值查询
  2. df.iloc方法,根据行、列的数字位置查询
  3. df.where方法
  4. df.query方法

.loc既能查询,又能覆盖写入,强烈推荐!

Pandas使用df.loc查询数据的方法

  1. 使用单个label值查询数据
  2. 使用值列表批量查询
  3. 使用数值区间进行范围查询
  4. 使用条件表达式查询
  5. 调用函数查询

注意

  • 以上查询方法,既适用于行,也适用于列
  • 注意观察降维dataFrame>Series>值

微信公众号:【蚂蚁学Python】,Python原创免费视频分享

代码
文本
[23]
import pandas as pd
print(pd.__version__)
1.0.1
代码
文本

0、读取数据

数据为北京2018年全年天气预报
该数据的爬虫教程参见我的Python爬虫系列视频课程

代码
文本
[2]
df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv")
代码
文本
[3]
df.head()
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
02018-01-013℃-6℃晴~多云东北风1-2级592
12018-01-022℃-5℃阴~多云东北风1-2级491
22018-01-032℃-5℃多云北风1-2级281
32018-01-040℃-8℃东北风1-2级281
42018-01-053℃-6℃多云~晴西北风1-2级501
,
代码
文本
[4]
# 设定索引为日期,方便按日期筛选
df.set_index('ymd', inplace=True)
代码
文本
[5]
# 时间序列见后续课程,本次按字符串处理
df.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',
,       ...
,       '2018-12-22', '2018-12-23', '2018-12-24', '2018-12-25', '2018-12-26',
,       '2018-12-27', '2018-12-28', '2018-12-29', '2018-12-30', '2018-12-31'],
,      dtype='object', name='ymd', length=365)
代码
文本
[6]
df.head()
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-01-013℃-6℃晴~多云东北风1-2级592
2018-01-022℃-5℃阴~多云东北风1-2级491
2018-01-032℃-5℃多云北风1-2级281
2018-01-040℃-8℃东北风1-2级281
2018-01-053℃-6℃多云~晴西北风1-2级501
,
代码
文本
[7]
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
代码
文本
[8]
df.dtypes
bWendu        int32
,yWendu        int32
,tianqi       object
,fengxiang    object
,fengli       object
,aqi           int64
,aqiInfo      object
,aqiLevel      int64
,dtype: object
代码
文本
[9]
df.head()
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-01-013-6晴~多云东北风1-2级592
2018-01-022-5阴~多云东北风1-2级491
2018-01-032-5多云北风1-2级281
2018-01-040-8东北风1-2级281
2018-01-053-6多云~晴西北风1-2级501
,
代码
文本

1、使用单个label值查询数据

行或者列,都可以只传入单个值,实现精确匹配

代码
文本
[10]
# 得到单个值
df.loc['2018-01-03', 'bWendu']
2
代码
文本
[11]
# 得到一个Series
df.loc['2018-01-03', ['bWendu', 'yWendu']]
bWendu     2
,yWendu    -5
,Name: 2018-01-03, dtype: object
代码
文本

2、使用值列表批量查询

代码
文本
[12]
# 得到Series
df.loc[['2018-01-03','2018-01-04','2018-01-05'], 'bWendu']
ymd
,2018-01-03    2
,2018-01-04    0
,2018-01-05    3
,Name: bWendu, dtype: int32
代码
文本
[13]
# 得到DataFrame
df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendu
ymd
2018-01-032-5
2018-01-040-8
2018-01-053-6
,
代码
文本

3、使用数值区间进行范围查询

注意:区间既包含开始,也包含结束

代码
文本
[14]
# 行index按区间
df.loc['2018-01-03':'2018-01-05', 'bWendu']
ymd
,2018-01-03    2
,2018-01-04    0
,2018-01-05    3
,Name: bWendu, dtype: int32
代码
文本
[15]
# 列index按区间
df.loc['2018-01-03', 'bWendu':'fengxiang']
bWendu        2
,yWendu       -5
,tianqi       多云
,fengxiang    北风
,Name: 2018-01-03, dtype: object
代码
文本
[16]
# 行和列都按区间查询
df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendutianqifengxiang
ymd
2018-01-032-5多云北风
2018-01-040-8东北风
2018-01-053-6多云~晴西北风
,
代码
文本

4、使用条件表达式查询

bool列表的长度得等于行数或者列数

代码
文本

简单条件查询,最低温度低于-10度的列表

代码
文本
[17]
df.loc[df["yWendu"]<-10, :]
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-01-23-4-12西北风3-4级311
2018-01-24-4-11西南风1-2级341
2018-01-25-3-11多云东北风1-2级271
2018-12-26-2-11晴~多云东北风2级261
2018-12-27-5-12多云~晴西北风3级481
2018-12-28-3-11西北风3级401
2018-12-29-3-12西北风2级291
2018-12-30-2-11晴~多云东北风1级311
,
代码
文本
[18]
# 观察一下这里的boolean条件
df["yWendu"]<-10
ymd
,2018-01-01    False
,2018-01-02    False
,2018-01-03    False
,2018-01-04    False
,2018-01-05    False
,              ...  
,2018-12-27     True
,2018-12-28     True
,2018-12-29     True
,2018-12-30     True
,2018-12-31    False
,Name: yWendu, Length: 365, dtype: bool
代码
文本

复杂条件查询,查一下我心中的完美天气

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

代码
文本
[19]
## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1), :]
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-08-243020北风1-2级401
2018-09-072716西北风3-4级221
,
代码
文本

我哭,北京好天气这么稀少!!

代码
文本
[20]
# 再次观察这里的boolean条件
(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1)
ymd
,2018-01-01    False
,2018-01-02    False
,2018-01-03    False
,2018-01-04    False
,2018-01-05    False
,              ...  
,2018-12-27    False
,2018-12-28    False
,2018-12-29    False
,2018-12-30    False
,2018-12-31    False
,Length: 365, dtype: bool
代码
文本

5、调用函数查询

代码
文本
[21]
# 直接写lambda表达式
df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-04-282717西南风3-4级125轻度污染3
2018-04-293016多云南风3-4级193中度污染4
2018-05-042716晴~多云西南风1-2级862
2018-05-092917晴~多云西南风3-4级792
2018-05-102618多云南风3-4级118轻度污染3
...........................
2018-09-152615多云北风3-4级421
2018-09-172717多云~阴北风1-2级371
2018-09-182517阴~多云西南风1-2级501
2018-09-192617多云南风1-2级522
2018-09-202716多云西南风1-2级632
,

64 rows × 8 columns

,
代码
文本
[22]
# 编写自己的函数,查询9月份,空气质量好的数据
def query_my_data(df):
return df.index.str.startswith("2018-09") & (df["aqiLevel"]==1)
df.loc[query_my_data, :]
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-09-012719阴~小雨南风1-2级501
2018-09-043118西南风3-4级241
2018-09-053119晴~多云西南风3-4级341
2018-09-062718多云~晴西北风4-5级371
2018-09-072716西北风3-4级221
2018-09-082715多云~晴北风1-2级281
2018-09-152615多云北风3-4级421
2018-09-162514多云~晴北风1-2级291
2018-09-172717多云~阴北风1-2级371
2018-09-182517阴~多云西南风1-2级501
2018-09-212514西北风3-4级501
2018-09-222413西北风3-4级281
2018-09-232312西北风4-5级281
2018-09-242311北风1-2级281
2018-09-252412晴~多云南风1-2级441
2018-09-292211北风3-4级211
2018-09-301913多云西北风4-5级221
,
代码
文本
python
Pandas
数据分析
pythonPandas数据分析
点个赞吧
推荐阅读
公开
04. Pandas查询数据
pythonnotebookPandas
pythonnotebookPandas
donglikun@dp.tech
更新于 2024-08-06
1 转存文件
公开
10. Pandas字符串处理
pythonPandas数据分析
pythonPandas数据分析
panjw@dp.tech
更新于 2024-08-06