pandas 數據結構
Series
- Series是一種類似于一維數組的對象,它由一組數據(不同數據類型)以及一組與之相關的數據標簽(即索引)組成。
列表創建
-
僅有數據列表即可產生最簡單的Series
s1 = pd.Series([1,'a',5.2,7]) '''左側為索引,右側是數據''' s1"""輸出如下""" 0 1 1 a 2 5.2 3 7 dtype: object
獲取索引
'''獲取索引''' s1.index"""輸出如下""" RangeIndex(start=0, stop=4, step=1)
獲取數據
''' 獲取數據''' s1.values"""輸出如下""" array([1, 'a', 5.2, 7], dtype=object)
創建標簽索引
-
創建一個具有標簽索引的Series
s2 = pd.Series([1, 'a', 5.2, 7], index=['d','b','a','c']) s2"""輸出如下""" d 1 b a a 5.2 c 7 dtype: object
獲取索引:
s2.index"""輸出如下""" Index(['d', 'b', 'a', 'c'], dtype='object')
字典創建
-
使用Python字典創建Series
sdata={'Ohio':35000,'Texas':72000,'Oregon':16000,'Utah':5000} s3=pd.Series(sdata) s3"""輸出如下""" Ohio 35000 Texas 72000 Oregon 16000 Utah 5000 dtype: int64
根據標簽索引查詢數據
-
類似Python的字典dict
s2"""輸出如下""" d 1 b a a 5.2 c 7 dtype: object
s2['a']"""輸出如下""" 5.2
type(s2['a'])"""輸出如下""" float
s2[['b','a']]"""輸出如下""" b a a 5.2 dtype: object
type(s2[['b','a']])"""輸出如下""" pandas.core.series.Series
DataFrame
-
DataFrame
是一個表格型的數據結構-
每列可以是不同的值類型(數值、字符串、布爾值等)
-
既有行索引index,也有列索引columns
-
可以被看做由Series組成的字典
創建dataframe最常用的方法,見02節讀取純文本文件、excel、mysql數據庫
-
多個字典創建
-
根據多個字典序列創建dataframe
data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]} df = pd.DataFrame(data) df
每一列的數據類型
# 每一列的數據類型 df.dtypes"""輸出如下""" state object year int64 pop float64 dtype: object
查看所有的列名
# 查看所有的列名(特征名稱、或者理解為列的索引) df.columns """輸出如下""" Index(['state', 'year', 'pop'], dtype='object')
查看行索引
# 查看行索引 df.index """輸出如下""" RangeIndex(start=0, stop=5, step=1
從DataFrame中查詢出Series
-
從DataFrame中查詢出Series
- 如果只查詢一行、一列,返回的是pd.Series
- 如果查詢多行、多列,返回的是pd.DataFrame
df
查詢多列
-
查詢多列,結果是一個pd.DataFrame
df[['year', 'pop']] """輸出如下"""
type(df[['year', 'pop']])"""輸出如下""" pandas.core.frame.DataFram
查詢一行
-
查詢一行,結果是一個
pd.Series
df.loc[1]"""輸出如下""" state Ohio year 2001 pop 1.7 Name: 1, dtype: object
type(df.loc[1])"""輸出如下""" pandas.core.series.Series
查詢多行
-
查詢多行,結果是一個
pd.DataFrame
查詢第2-4行
df.loc[1:3]"""輸出如下"""
type(df.loc[1:3])"""輸出如下""" pandas.core.frame.DataFrame
三、Pandas查詢數據
-
Pandas查詢數據的幾種方法
1. `df.loc`方法,根據行、列的標簽值查詢 2. `df.iloc`方法,根據行、列的數字位置查詢 3. `df.where`方法 4. `df.query`方法
.loc
既能查詢,又能覆蓋寫入,強烈推薦! -
Pandas
使用df.loc
查詢數據的方法- 使用單個label值查詢數據
- 使用值列表批量查詢
- 使用數值區間進行范圍查詢
- 使用條件表達式查詢
- 調用函數查詢
-
注意
- 以上查詢方法,既適用于行,也適用于列
- 注意觀察降維
dataFrame
>Series
>值
print(pd.__version__)1.1.5
讀取數據
-
數據為北京2018年全年天氣預報
df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv") df.head()
設定索引為日期
# 設定索引為日期,方便按日期篩選 df.set_index('ymd', inplace=True)
# 時間序列見后續,本次按字符串處理 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)
替換掉溫度的后綴
# 替換掉溫度的后綴℃ df.loc[:,'bWendu'] = df['bWendu'].str.replace('℃',"").astype('int32') df.loc[:,'yWendu'] = df['yWendu'].str.replace('℃',"").astype('int32')df.dtypes"""輸出如下""" bWendu int32 yWendu int32 tianqi object fengxiang object fengli object aqi int64 aqiInfo object aqiLevel int64 dtype: object
df.head() """輸出如下"""
查詢數據
單個label
-
使用單個label值查詢數據
-
? 行或者列,都可以只傳入單個值,實現精確匹配
得到單個值 (2018年1月3日的最高溫度)
# 得到單個值 (2018年1月3日的最高溫度) df.loc['2018-01-03', 'bWendu']"""輸出如下""" 2
得到一個Series(2018年1月3日的最高溫度和最低溫度)
# 得到一個Series(2018年1月3日的最高溫度和最低溫度) df.loc['2018-01-03',['bWendu','yWendu']]"""輸出如下""" bWendu 2 yWendu -5 Name: 2018-01-03, dtype: object
批量查詢
-
使用值列表批量查詢
得到Series:18年1月3,4,5日的最高溫度
# 得到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
得到DataFrame:18年1月3,4,5日的最高溫度和最低溫度
# 得到DataFrame df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]"""輸出如下"""
范圍查詢
-
使用數值區間進行范圍查詢
注意:區間既包含開始,也包含結束
行index按區間 (2018年1月3日至5號的最高溫度和最低溫度)
# 行index按區間 (2018年1月3日至5號的最高溫度和最低溫度)(series) 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
列index按區間
# 列index按區間(series) df.loc['2018-01-03', 'bWendu':'fengxiang']"""輸出如下""" bWendu 2 yWendu -5 tianqi 多云 fengxiang 北風 Name: 2018-01-03, dtype: object
行和列都按區間查詢
# 行和列都按區間查詢(DataFrame) df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']"""輸出如下"""
使用條件表達式查詢
- bool列表的長度得等于行數或者列數
簡單條件查詢
-
簡單條件查詢,最低溫度低于-10度的列表
df.loc[df['yWendu']<-10,:]"""輸出如下"""
觀察一下這里的boolean條件
# 觀察一下這里的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
復雜條件查詢
-
復雜條件查詢,查一下完美天氣
注意,組合條件用&符號合并,每個條件判斷都得帶括號
查詢最高溫度小于30度,并且最低溫度大于15度,并且是晴天,并且天氣為優的數據
## 查詢最高溫度小于30度,并且最低溫度大于15度,并且是晴天,并且天氣為優的數據 df.loc[(df['bWendu']<=30) & (df['yWendu']>15)&(df["tianqi"]=='晴') & (df["aqiLevel"]==1),:]"""輸出如下"""
再次觀察這里的boolean條件
# 再次觀察這里的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
調用函數查詢
lambda表達式
-
直接寫lambda表達式
# 直接寫lambda表達式 df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]"""輸出如下"""
編寫函數
-
自己編寫函數
# 編寫自己的函數,查詢9月份,空氣質量好的數據 def query_my_data(df):return df.index.str.startswith("2018-9") & (df["aqiLevel"]==1)df.loc[query_my_data, :]"""輸出如下"""