1. 程式人生 > 實用技巧 >4.pandas的進階查詢

4.pandas的進階查詢

簡單的查詢其實根本不能滿足實際開發的需求

需求可能是讓你查一下2018年的銷售額啊,2019年溫度超過30℃的天數啊等等的

這些需求都是有異曲同工的,就是帶條件的查詢

這裡我們先自己設計一個表格,並將其讀取出來

import pandas as pd

df = pd.read_excel('test1.xlsx')
print(df)
         data wendu_min wendu_max weather  fengji
0  2020-01-01        1℃       15℃       晴       1
1  2020-01-02        1℃       16℃      多雲       2
2  2020-01-03        1℃       17℃      小雨       4
3  2020-01-04        4℃       18℃       陰       2
4  2020-01-05        1℃       19℃      大雨       1
5  2020-01-06        3℃       20℃      小雨       3
6  2020-01-07        1℃       21℃       晴       5
7  2020-01-08        1℃       22℃      多雲       2
8  2020-01-09        1℃       23℃       陰       1
9  2020-01-10        0℃       24℃      小雨       3
10 2020-01-11        2℃       25℃      多雲       4

為了查詢方便,所以我將日期當做查詢的索引

df.set_index('data', inplace=True)

這個inplace是指修改可以及時看到

           wendu_min wendu_max weather  fengji
data                                          
2020-01-01        1℃       15℃       晴       1
2020-01-02        1℃       16℃      多雲       2
2020-01-03        1℃       17℃      小雨       4
2020-01-04        4℃       18℃       陰       2
2020-01-05        1℃       19℃      大雨       1
2020-01-06        3℃       20℃      小雨       3
2020-01-07        1℃       21℃       晴       5
2020-01-08        1℃       22℃      多雲       2
2020-01-09        1℃       23℃       陰       1
2020-01-10        0℃       24℃      小雨       3
2020-01-11        2℃       25℃      多雲       4

像這種溫度帶著的℃,不便於資料的分析,所以我們在剛開始的時候,可以將其去掉

df['wendu_min'] = df['wendu_min'].str.replace('℃', '').astype('int32')
df['wendu_max'] = df['wendu_max'].str.replace('℃', '').astype('int32')
            wendu_min  wendu_max weather  fengji
data                                            
2020-01-01          1         15       晴       1
2020-01-02          1         16      多雲       2
2020-01-03          1         17      小雨       4
2020-01-04          4         18       陰       2
2020-01-05          1         19      大雨       1
2020-01-06          3         20      小雨       3
2020-01-07          1         21       晴       5
2020-01-08          1         22      多雲       2
2020-01-09          1         23       陰       1
2020-01-10          0         24      小雨       3
2020-01-11          2         25      多雲       4

資料都處理完畢,現在就開始進行查詢

查詢單個數據

我想查一月9號的最高溫度

df.loc['2020-01-09', 'wendu_max']
23

先傳行索引,再傳列索引

查詢多個數據

我想查一月6號到一月10號之間的所有資料

df.loc['2020-01-06':'2020-01-10', :]
            wendu_min  wendu_max weather  fengji
data                                            
2020-01-06          3         20      小雨       3
2020-01-07          1         21       晴       5
2020-01-08          1         22      多雲       2
2020-01-09          1         23       陰       1
2020-01-10          0         24      小雨       3

:代表著所有的資料

使用條件查詢

我想得到最低溫度大於1℃的資料

df.loc[df['wendu_min'] > 1, :]
            wendu_min  wendu_max weather  fengji
data                                            
2020-01-04          4         18       陰       2
2020-01-06          3         20      小雨       3
2020-01-11          2         25      多雲       4

我想要最低溫度大於1℃,最高溫度小於25℃的天氣

df.loc[(df['wendu_min'] > 1) & (df['wendu_max'] < 25), :]
            wendu_min  wendu_max weather  fengji
data                                            
2020-01-04          4         18       陰       2
2020-01-06          3         20      小雨       3

多個條件要用括號括起來,然後用&連線

使用函式查詢

使用lambda表示式

如果lambda不太熟練就跳過這裡

df.loc[lambda df: (df['wendu_min'] > 1) & (df['wendu_max'] < 25), :]
            wendu_min  wendu_max weather  fengji
data                                            
2020-01-04          4         18       陰       2
2020-01-06          3         20      小雨       3

自己編寫的函式查詢

我認為最低溫度大於1℃,最高溫度小於25℃的就是好天氣,所以先寫一個函式

def goodWeather(df):
    return (df['wendu_min'] > 1) & (df['wendu_max'] < 25)

然後再使用這個函式進行資料查詢

df.loc[goodWeather, :]
            wendu_min  wendu_max weather  fengji
data                                            
2020-01-04          4         18       陰       2
2020-01-06          3         20      小雨       3

注意這裡放的是函式名,而不是函式名()