新建
04. Pandas查询数据
donglikun@dp.tech
推荐镜像 :Basic Image:bohrium-notebook:2023-04-07
推荐机型 :c2_m4_cpu
赞
1
目录
数据集
PandasApplication(v1)
Pandas查询数据
今天没有漂亮的PPT,只有干货!!
Pandas查询数据的几种方法
- df.loc方法,根据行、列的标签值查询
- df.iloc方法,根据行、列的数字位置查询
- df.where方法
- df.query方法
.loc既能查询,又能覆盖写入,强烈推荐!
Pandas使用df.loc查询数据的方法
- 使用单个label值查询数据
- 使用值列表批量查询
- 使用数值区间进行范围查询
- 使用条件表达式查询
- 调用函数查询
注意
- 以上查询方法,既适用于行,也适用于列
- 注意观察降维dataFrame>Series>值
微信公众号:【蚂蚁学Python】,Python原创免费视频分享
代码
文本
[1]
import pandas as pd
print(pd.__version__)
1.5.3
代码
文本
0、读取数据
数据为北京2018年全年天气预报
该数据的爬虫教程参见我的Python爬虫系列视频课程
代码
文本
[2]
df = pd.read_csv("/bohr/PandasData-yx0y/v1/datas/beijing_tianqi/beijing_tianqi_2018.csv")
代码
文本
[3]
df.head()
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 |
代码
文本
[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()
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 |
代码
文本
[7]
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
/tmp/ipykernel_119/4185933180.py:2: DeprecationWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)` df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32') /tmp/ipykernel_119/4185933180.py:3: DeprecationWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)` 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()
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 |
代码
文本
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']]
bWendu | yWendu | |
---|---|---|
ymd | ||
2018-01-03 | 2 | -5 |
2018-01-04 | 0 | -8 |
2018-01-05 | 3 | -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']
bWendu | yWendu | tianqi | fengxiang | |
---|---|---|---|---|
ymd | ||||
2018-01-03 | 2 | -5 | 多云 | 北风 |
2018-01-04 | 0 | -8 | 阴 | 东北风 |
2018-01-05 | 3 | -6 | 多云~晴 | 西北风 |
代码
文本
4、使用条件表达式查询
bool列表的长度得等于行数或者列数
代码
文本
简单条件查询,最低温度低于-10度的列表
代码
文本
[17]
df.loc[df["yWendu"]<-10, :]
bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|
ymd | ||||||||
2018-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 |
代码
文本
[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), :]
bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|
ymd | ||||||||
2018-08-24 | 30 | 20 | 晴 | 北风 | 1-2级 | 40 | 优 | 1 |
2018-09-07 | 27 | 16 | 晴 | 西北风 | 3-4级 | 22 | 优 | 1 |
代码
文本
我哭,北京好天气这么稀少!!
代码
文本
[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), :]
bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|
ymd | ||||||||
2018-04-28 | 27 | 17 | 晴 | 西南风 | 3-4级 | 125 | 轻度污染 | 3 |
2018-04-29 | 30 | 16 | 多云 | 南风 | 3-4级 | 193 | 中度污染 | 4 |
2018-05-04 | 27 | 16 | 晴~多云 | 西南风 | 1-2级 | 86 | 良 | 2 |
2018-05-09 | 29 | 17 | 晴~多云 | 西南风 | 3-4级 | 79 | 良 | 2 |
2018-05-10 | 26 | 18 | 多云 | 南风 | 3-4级 | 118 | 轻度污染 | 3 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
2018-09-15 | 26 | 15 | 多云 | 北风 | 3-4级 | 42 | 优 | 1 |
2018-09-17 | 27 | 17 | 多云~阴 | 北风 | 1-2级 | 37 | 优 | 1 |
2018-09-18 | 25 | 17 | 阴~多云 | 西南风 | 1-2级 | 50 | 优 | 1 |
2018-09-19 | 26 | 17 | 多云 | 南风 | 1-2级 | 52 | 良 | 2 |
2018-09-20 | 27 | 16 | 多云 | 西南风 | 1-2级 | 63 | 良 | 2 |
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, :]
bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|
ymd | ||||||||
2018-09-01 | 27 | 19 | 阴~小雨 | 南风 | 1-2级 | 50 | 优 | 1 |
2018-09-04 | 31 | 18 | 晴 | 西南风 | 3-4级 | 24 | 优 | 1 |
2018-09-05 | 31 | 19 | 晴~多云 | 西南风 | 3-4级 | 34 | 优 | 1 |
2018-09-06 | 27 | 18 | 多云~晴 | 西北风 | 4-5级 | 37 | 优 | 1 |
2018-09-07 | 27 | 16 | 晴 | 西北风 | 3-4级 | 22 | 优 | 1 |
2018-09-08 | 27 | 15 | 多云~晴 | 北风 | 1-2级 | 28 | 优 | 1 |
2018-09-15 | 26 | 15 | 多云 | 北风 | 3-4级 | 42 | 优 | 1 |
2018-09-16 | 25 | 14 | 多云~晴 | 北风 | 1-2级 | 29 | 优 | 1 |
2018-09-17 | 27 | 17 | 多云~阴 | 北风 | 1-2级 | 37 | 优 | 1 |
2018-09-18 | 25 | 17 | 阴~多云 | 西南风 | 1-2级 | 50 | 优 | 1 |
2018-09-21 | 25 | 14 | 晴 | 西北风 | 3-4级 | 50 | 优 | 1 |
2018-09-22 | 24 | 13 | 晴 | 西北风 | 3-4级 | 28 | 优 | 1 |
2018-09-23 | 23 | 12 | 晴 | 西北风 | 4-5级 | 28 | 优 | 1 |
2018-09-24 | 23 | 11 | 晴 | 北风 | 1-2级 | 28 | 优 | 1 |
2018-09-25 | 24 | 12 | 晴~多云 | 南风 | 1-2级 | 44 | 优 | 1 |
2018-09-29 | 22 | 11 | 晴 | 北风 | 3-4级 | 21 | 优 | 1 |
2018-09-30 | 19 | 13 | 多云 | 西北风 | 4-5级 | 22 | 优 | 1 |
代码
文本
点个赞吧
推荐阅读
公开
04. Pandas查询数据panjw@dp.tech
更新于 2024-08-12
公开
10. Pandas字符串处理panjw@dp.tech
更新于 2024-08-06