4.pandas的進階查詢
阿新 • • 發佈:2020-07-25
簡單的查詢其實根本不能滿足實際開發的需求
需求可能是讓你查一下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
注意這裡放的是函式名,而不是函式名()