在本章中,我們將學習使用 Pandas 進行數據選擇的高級技術,如何選擇數據子集,如何從數據集中選擇多個行和列,如何對 Pandas 數據幀或一序列數據進行排序,如何過濾 Pandas 數據幀的角色,還學習如何將多個過濾器應用於 Pandas 數據幀。我們還將研究如何在 Pandas 中使用axis參數以及在 Pandas 中使用字符串方法。最後,我們將學習如何更改 Pandas 序列的數據類型。
首先,我們將學習如何從 Pandas 數據幀中選擇數據子集並創建序列對象。我們將從導入真實數據集開始。我們將介紹一些 Pandas 數據選擇方法,並將這些方法應用於實際數據集,以演示數據子集的選擇。
在本章中,我們將討論以下主題:
數據集簡介我們將使用 zillow.com的真實數據集,這是一個在線房地產市場,其發布房價數據集是他們研究工作的一部分。這些數據集可在公共領域獲得,並在歸屬於 zillow.com後可免費使用。我們將使用有關美國地區平均房價的最新數據。它是 CSV 數據集,或帶有 CSV 的文本文件。讓我們首先將 pandas 模塊導入到 Jupyter 筆記本中,如下所示:
1
2
import pandas as pd
data = pd.read_csv('data-zillow.csv', sep=',')
1
2
regions = data['RegionName'] #根據列名選擇
type(regions) #series對象
1
2
3
region_n_state = data[['RegionName', 'State']] #傳遞列名數組,選擇多個列
region_n_state.head()
type(region_n_state)#DataFrame對象
1
2
data.State#選擇單列
data['Address'] = data.County + ', ' + data.Metro + ', ' + data.State#生成新列
1
2
zillow.loc[7, 'Metro'] #行索引7,列名為Metro
zillow.iloc[7,4]#行索引7,列索引4
1
2
3
zillow.loc[7, ['Metro', 'County']]
zillow.iloc[7,[4,5]]
zillow.loc[11,:]
1
zillow.loc[101:105, 'Metro']
1
2
3
zillow.loc[201:204, "State":"County"]
zillow.iloc[201:205, 3:6]
zillow.loc[201:205, ['RegionName', 'State']]
在這裡,我們將使用loc方法查看行和列序列中的值。為此,loc方法的第一個參數是要選擇的行的範圍索引。由於我們需要所有列中的值,因此我們將冒號(:)作為第二個參數,如下所示:
1
2
3
4
zillow.loc[201:205, :]
zillow.loc[[0,5,10], :] #選擇不連續的行
zillow.loc[zillow.County=="Queens"] #選擇County列的值為Queens的行
zillow.loc[zillow.Metro=="New York", "County"] #從County列中選擇Metro列為New York的行
1
2
3
4
5
6
zillow.sort_values('Metro') #對Metro列排序(默認升序)
sorted = zillow.sort_values('Metro', ascending=False) #降序排序
sorted = zillow.sort_values(by=['Metro','County']) #按Metro首先對數據進行排序,然後按County列進行排
sorted = zillow.sort_values(by=['Metro','County', 'Zhvi'], ascending=[True, True, False])
regions = zillow.RegionID
regions.sort_values() #對Series對象排序
1
2
3
4
5
filtered_data = data.filter(items=['State', 'Metro']) #使用filter方法過濾列
filtered_data = data.filter(regex='Region', axis=1) #使用正則表達式過濾列名稱
price_filter_series = data['Zhvi'] > 500000
data[price_filter_series]
data[data.Zhvi >= 1000000] #過濾Zhvi列大於1000000的行
1
2
data[(data['Zhvi'] > 1000000) & (data['State'] == 'NY')] #選擇價格值大於 1,000,000 且State為New York的行
data[((data['State'] == 'CA') | (data['State'] == 'NY'))]
篩選數據的另一種方法是使用isin方法。我們可以使用isin方法通過一個或多個特定列的值列表來過濾數據集。在這裡,我們僅從Metro列中選擇值New York或San Francisco的那些記錄。
我們在Metro列上調用isin方法,並將其傳遞給包含我們要選擇的城市的列表。這將創建一個布爾序列。然後,我們將布爾序列傳遞給數據集數據幀進行必要的過濾和選擇,如下所示:
1
2
filter = data['Metro'].isin(['New York', 'San Francisco'])
data[filter].head()
我們還可以使用isin方法根據來自多列的值過濾行。為了執行此操作,我們傳遞了一個字典對象,其中的鍵是列名,而值是我們要從中選擇記錄的那些列的值的列表。
舉個例子,讓我們選擇State參數為California和Metro參數為San Francisco的值。我們使用包含要選擇的值的這兩列創建一個字典對象,然後將該字典項傳遞給isin方法,並在數據集上調用isin方法。然後,將過濾器傳遞給數據幀並選擇我們的記錄,如下所示:
1
2
filter = data.isin({'State': ['CA'], 'Metro': ['San Francisco']})
data[filter].head()
在本節中,我們將學習在 Pandas 中進行數據分析時何時何地使用axis參數或關鍵字。我們將介紹axis參數,並逐步介紹可以將axis關鍵字設置為的各種值。我們將演示如何將axis設置為行或列來改變方法的行為。我們還將展示一些使用axis關鍵字的代碼示例。
axis參數的用法在axis用法示例中,我們計算數據集中值的平均值。我們已將axis傳遞為0。這意味著將沿著行axis計算平均值,如下所示:
輸出如下:
接下來,我們將axis設置為1。我們在同一數據集上使用完全相同的方法;但是,我們正在將axis從0更改為1。由於我們將axis設置為1,因此mean的計算如下:
1
data.mean(axis=1).head()
輸出如下:
有時很難記住0或1是用於行還是用於列。因此,您可以將axis設置為rows而不是使用axis0:
輸出為以下內容:
對於列,您可以將axis設置為columns。與使用0或1具有相同的效果:
1
data.mean(axis='columns').head()
輸出如下:
axis關鍵字的更多示例在這裡,我們使用drop方法刪除行或記錄。我們通過將關鍵字axis傳遞為0來告訴drop方法將記錄刪除到0的索引處:
1
2
data.drop(0, axis=0) #刪除第0行
data.drop('Date', axis=1).head #刪除帶有Date標籤的列
1
data.filter(regex='Region', axis=1) #過濾列名為正則表達式'Region'的列
在本節中,我們將學習在 Pandas 序列中使用各種字符串方法。我們將把真實的數據集讀入 Pandas。我們將探索一些字符串方法,並將使用這些字符串方法從數據集中選擇和更改值。
檢查子串為了學習如何使用字符串方法檢查 Pandas 序列的子字符串,我們使用str包中的contains方法。
在這裡,我們從數據集中調用RegionName序列上的str.contains方法。我們正在尋找包含New子字符串的記錄。它列印出一個布爾序列,列印True找到一個子字符串,而False找到一個子字符串:
1
data[data.RegionName.str.contains('New')] #過濾RegionName列中包含New字符串的行
1
data.RegionName.str.upper()
1
2
3
4
data.County.str.lower()
data.County.str.len()#查找列中每個值的長度
data.RegionName.str.lstrip()#刪除空格
data.RegionName.str.replace(' ','')#空格替換為無空格
在本節中,我們將學習如何更改 Pandas 序列的數據類型。我們將看到讀取其中的數據後如何更改數據類型。我們還將學習在讀取 Pandas 數據時如何更改數據類型。我們將通過一個示例將int列更改為float。我們還將看到如何將字符串值列轉換為datetime數據類型。
1
data['Zhvi'] = data.Zhvi.astype(float) #將int數據類型列更改為float
在將數據讀入 pandas 之後,我們只是更改了列的數據類型。另外,我們可以在讀取數據時更改數據類型。為此,我們將列名和數據類型傳遞到要更改為read數據方法的列中。我們想要的float列已導入為float64:
1
2
data2 = pd.read_csv('data-zillow.csv', sep=',', dtype={'Zhvi':float})
data2.dtypes
1
pd.to_datetime(data2.Date,infer_datetime_format=True)
在下一章中,我們將學習處理,轉換和重塑數據的技術。敬請期待!