今天没有漂亮的PPT,只有干货!!
Pandas查询数据的几种方法df.loc方法,根据行、列的标签值查询
df.iloc方法,根据行、列的数字位置查询
df.where方法
df.query方法
.loc既能查询,又能覆盖写入,强烈推荐!
Pandas使用df.loc查询数据的方法使用单个label值查询数据
使用值列表批量查询
使用数值区间进行范围查询
使用条件表达式查询
调用函数查询
注意以上查询方法,既适用于行,也适用于列
注意观察降维dataFrame>Series>值
微信公众号:【蚂蚁学Python】,Python原创免费视频分享import pandas as pd
0、读取数据
数据为北京2018年全年天气预报
该数据的爬虫教程参见我的Python爬虫系列视频课程df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv")df.head()
ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel02018-01-013℃-6℃晴~多云东北风1-2级59良2
12018-01-022℃-5℃阴~多云东北风1-2级49优1
22018-01-032℃-5℃多云北风1-2级28优1
32018-01-040℃-8℃阴东北风1-2级28优1
42018-01-053℃-6℃多云~晴西北风1-2级50优1# 设定索引为日期,方便按日期筛选
df.set_index('ymd', inplace=True)# 时间序列见后续课程,本次按字符串处理
df.indexIndex(['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)df.head()
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd2018-01-013℃-6℃晴~多云东北风1-2级59良2
2018-01-022℃-5℃阴~多云东北风1-2级49优1
2018-01-032℃-5℃多云北风1-2级28优1
2018-01-040℃-8℃阴东北风1-2级28优1
2018-01-053℃-6℃多云~晴西北风1-2级50优1# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')df.dtypesbWendu int32
yWendu int32
tianqi object
fengxiang object
fengli object
aqi int64
aqiInfo object
aqiLevel int64
dtype: objectdf.head()
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd2018-01-013-6晴~多云东北风1-2级59良2
2018-01-022-5阴~多云东北风1-2级49优1
2018-01-032-5多云北风1-2级28优1
2018-01-040-8阴东北风1-2级28优1
2018-01-053-6多云~晴西北风1-2级50优1
1、使用单个label值查询数据
行或者列,都可以只传入单个值,实现精确匹配# 得到单个值
df.loc['2018-01-03', 'bWendu']2# 得到一个Series
df.loc['2018-01-03', ['bWendu', 'yWendu']]bWendu 2
yWendu -5
Name: 2018-01-03, dtype: object
2、使用值列表批量查询# 得到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# 得到DataFrame
df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]
bWenduyWendu
ymd2018-01-032-5
2018-01-040-8
2018-01-053-6
3、使用数值区间进行范围查询
注意:区间既包含开始,也包含结束# 行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# 列index按区间
df.loc['2018-01-03', 'bWendu':'fengxiang']bWendu 2
yWendu -5
tianqi 多云
fengxiang 北风
Name: 2018-01-03, dtype: object# 行和列都按区间查询
df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']
bWenduyWendutianqifengxiang
ymd2018-01-032-5多云北风
2018-01-040-8阴东北风
2018-01-053-6多云~晴西北风
4、使用条件表达式查询
bool列表的长度得等于行数或者列数
简单条件查询,最低温度低于-10度的列表df.loc[df["yWendu"]
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd2018-01-23-4-12晴西北风3-4级31优1
2018-01-24-4-11晴西南风1-2级34优1
2018-01-25-3-11多云东北风1-2级27优1
2018-12-26-2-11晴~多云东北风2级26优1
2018-12-27-5-12多云~晴西北风3级48优1
2018-12-28-3-11晴西北风3级40优1
2018-12-29-3-12晴西北风2级29优1
2018-12-30-2-11晴~多云东北风1级31优1# 观察一下这里的boolean条件
df["yWendu"]
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
复杂条件查询,查一下我心中的完美天气
注意,组合条件用&符号合并,每个条件判断都得带括号## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1), :]
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd2018-08-243020晴北风1-2级40优1
2018-09-072716晴西北风3-4级22优1
我哭,北京好天气这么稀少!!# 再次观察这里的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、调用函数查询# 直接写lambda表达式
df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd2018-04-282717晴西南风3-4级125轻度污染3
2018-04-293016多云南风3-4级193中度污染4
2018-05-042716晴~多云西南风1-2级86良2
2018-05-092917晴~多云西南风3-4级79良2
2018-05-102618多云南风3-4级118轻度污染3
………………………
2018-09-152615多云北风3-4级42优1
2018-09-172717多云~阴北风1-2级37优1
2018-09-182517阴~多云西南风1-2级50优1
2018-09-192617多云南风1-2级52良2
2018-09-202716多云西南风1-2级63良2
64 rows × 8 columns# 编写自己的函数,查询9月份,空气质量好的数据
def query_my_data(df):
return df.index.str.startswith("2018-09") & df["aqiLevel"]==1
df.loc[query_my_data, :]
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd2018-09-012719阴~小雨南风1-2级50优1
2018-09-043118晴西南风3-4级24优1
2018-09-053119晴~多云西南风3-4级34优1
2018-09-062718多云~晴西北风4-5级37优1
2018-09-072716晴西北风3-4级22优1
2018-09-082715多云~晴北风1-2级28优1
2018-09-132920多云~阴南风1-2级107轻度污染3
2018-09-142819小雨~多云南风1-2级128轻度污染3
2018-09-152615多云北风3-4级42优1
2018-09-162514多云~晴北风1-2级29优1
2018-09-172717多云~阴北风1-2级37优1
2018-09-182517阴~多云西南风1-2级50优1
2018-09-212514晴西北风3-4级50优1
2018-09-222413晴西北风3-4级28优1
2018-09-232312晴西北风4-5级28优1
2018-09-242311晴北风1-2级28优1
2018-09-252412晴~多云南风1-2级44优1
2018-09-292211晴北风3-4级21优1
2018-09-301913多云西北风4-5级22优1
本文的代码地址:https://github.com/peiss/ant-learn-pandas
本文的视频地址:微信公众号:蚂蚁学Python
相关推荐