pandas(三)数据查询

数值、列表、区间、条件、函数

Pandas查询数据的几种方法

  1. df.loc方法,根据行、列的标签值查询
  2. df.iloc方法,根据行、列的数字位置查询
  3. df.where方法
  4. 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-2592
1	2018-01-02	2-5℃	    阴~多云	  东北风	    1-2491
2	2018-01-03	2-5℃	    多云	      北风	    1-2281
3	2018-01-04	0-8℃	    阴	      东北风	    1-2281
4	2018-01-05	3-6℃	    多云~晴	  西北风	    1-2501
  • 设定索引为日期,方便查询
    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-2592
    2018-01-02	2-5℃	阴~多云	东北风	1-2491
    2018-01-03	2-5℃	多云	北风	1-2281
    2018-01-04	0-8℃	阴	东北风	1-2281
    2018-01-05	3-6℃	多云~晴	西北风	1-2501
    
  • 替换掉温度后的℃
    前面行:为所有的行, 指定列
    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-2592
    2018-01-02	2	-5~多云	东北风	1-2491
    2018-01-03	2	-5	多云	北风	1-2281
    2018-01-04	0	-8	阴	东北风	1-2281
    2018-01-05	3	-6	多云~晴	西北风	1-2501
    
二、数据查询
  • 使用单个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-4311
    2018-01-24	-4	-11	晴	西南风	1-2341
    ...	...	...	...	...	...	...	...	...
    2018-12-29	-3	-12	晴	西北风	2291
    2018-12-30	-2	-11~多云	东北风	1311
    
    查询最低温度是否小雨-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-2401
    2018-09-07	27	16	晴	西北风	3-4221
    
    天气的 最高气温小于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-4125	轻度污染	3
    2018-04-29	30	16	多云	南风	        3-4193	中度污染	4
    ...	...	...	...	...	...	...	...	...
    2018-09-19	26	17	多云	    南风	   1-2522
    2018-09-20	27	16	多云	    西南风  1-2632
    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-2501
    2018-09-04	31	18	晴	西南风	3-4241
    ...	...	...	...	...	...	...	...	...
    2018-09-29	22	11	晴	北风	3-4211
    2018-09-30	19	13	多云	西北风	4-5221
    

猜你喜欢

转载自blog.csdn.net/a6864657/article/details/131494035