数值、列表、区间、条件、函数
Pandas查询数据的几种方法
- df.loc方法,根据行、列的标签值查询
- df.iloc方法,根据行、列的数字位置查询
- df.where方法
- df.query方法
.loc既能查询,又能覆盖写入,强烈推荐!
Pandas使用df.Ioc查询数据的方法
6. 使用单个label值查询数据
7. 使用值列表批量查询
8. 使用数值区间进行范围查询
9. 使用条件表达式查询
10. 调用函数查询
以上查询方法,既适用行,也适用列
注意观察降维打 DataFrame > Series > 值
import pandas as pd
fpath = '/Users/python/Desktop/means/ml-25m/beijing_tianqi_2018.csv'
df = pd.read_csv(fpath)
# 查看前几行数据
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
- 设定索引为日期,方便查询
df.set_index("ymd", inplace=True)
- 查看时间序列号索引列
df.index # 索引名称 ymd 索引长度365 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)
- 以时间为索引后,查看前几行数据
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
- 替换掉温度后的℃
前面行:为所有的行, 指定列 df.loc[:, 'bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32') df.loc[:, 'yWendu'] = df['yWendu'].str.replace('℃', '').astype('int32') 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
二、数据查询
-
使用单个label 值查询数据
行或者列,都可以只传单个值,实现精确匹配# 查询某个单元格的值 行 列 df.loc['2018-01-04', 'bWendu'] 0
# 查询某些单元格的值(行、列),返回Series; 查询条件(行单个, 列多个) df.loc['2018-01-04', ['bWendu', 'tianqi']] bWendu 0 tianqi 阴 Name: 2018-01-04, dtype: object
-
使用值列表批量查询
查询条件(行多个, 列单个); 返回Series df.loc[['2018-01-02', '2018-01-03', '2018-01-04'], 'bWendu'] ymd 2018-01-02 2 2018-01-03 2 2018-01-04 0 Name: bWendu, dtype: object
查询条件(行多个, 列多个); 返回DataFrame df.loc[['2018-01-02', '2018-01-03', '2018-01-04'], ['bWendu', 'yWendu']] bWendu yWendu ymd 2018-01-02 2 -5 2018-01-03 2 -5 2018-01-04 0 -8
-
使用数值区间进行范围查询,区间既包含开始,也包含结束
查询某些行区间的某一列的值 即index 区间的值 行开始:结束, 列 df.loc['2018-01-02':'2018-01-04', 'bWendu'] ymd 2018-01-02 2 2018-01-03 2 2018-01-04 0 Name: bWendu, dtype: object
查询某一行的某些列区间的值 即index的区间数据 行, 列开始:结束 df.loc['2018-01-04', 'bWendu':'tianqi'] bWendu 0 yWendu -8 tianqi 阴 Name: 2018-01-04, dtype: object
查询某些行与某些列区间的数据 即index的区间数据 行开始:结束, 列开始:结束 df.loc['2018-01-02':'2018-01-04', 'bWendu':'tianqi'] bWendu yWendu tianqi ymd 2018-01-02 2 -5 阴~多云 2018-01-03 2 -5 多云 2018-01-04 0 -8 阴
-
使用条件表达式查询,bool列表的长度等于行数或列数
简单条件查询,最低温度小于-10度的列表 df.loc[df['yWendu']<-10, :] 前行 温度小于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-12-29 -3 -12 晴 西北风 2级 29 优 1 2018-12-30 -2 -11 晴~多云 东北风 1级 31 优 1
查询最低温度是否小雨-10度 df['yWendu']<-10 ymd 2018-01-01 False 2018-01-02 False ... 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), :] 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
天气的 最高气温小于30度,并且最低气温大于15度,并且晴天,并且天气为优 是否为ture false (df['bWendu'] <= 30) & (df['yWendu'] >= 15) & (df['tianqi'] == '晴') & (df['aqiLevel'] == 1) ymd 2018-01-01 False 2018-01-02 False ... 2018-12-30 False 2018-12-31 False Length: 365, dtype: bool
-
调用函数查询
扫描二维码关注公众号,回复: 17145301 查看本文章获取 最高温度大于30,且最低温度15 的数据 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-09-19 26 17 多云 南风 1-2级 52 良 2 2018-09-20 27 16 多云 西南风 1-2级 63 良 2 64 rows × 8 columns
查询9月份空气质量为优的数据 def query_weather_data(df): return df.index.str.startswith('2018-09') & (df['aqiLevel'] == 1) df.loc[query_weather_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-29 22 11 晴 北风 3-4级 21 优 1 2018-09-30 19 13 多云 西北风 4-5级 22 优 1