目錄
數據摘要與映射
import pandas as pd
pd.set_option('max_rows', 5)
import numpy as np
melbourne_data = pd.read_csv('melb_data.csv')
melbourne_data.head()
摘要功能
pandas提供了許多簡單的“彙總函數”(不是正式名稱),它以某種有用的方式重構數據。 例如,考慮describe方法:
melbourne_data.Price.describe()
此方法生成給定列的屬性的高級摘要。 它是類型感知的,這意味着它的輸出根據輸入的dtype而改變。 上面的輸出只對數值數據有意義; 對於字符串數據,這是我們得到的:
melbourne_data.Address.describe()
count 13580 unique 13378 top 5 Margaret St freq 3 Name: Address, dtype: object
如果你想獲得有關DataFrame或Series中的列的特定簡單摘要統計信息,通常會有一個有用的pandas函數來實現它。 例如,要查看分配的點的平均值,我們可以使用平均函數mean:
melbourne_data.Price.mean()
1075684.079455081
要查看唯一值列表,我們可以使用唯一函數unique:
melbourne_data.Address.unique()
array(['85 Turner St', '25 Bloomburg St', '5 Charles St', ...,
'83 Power St', '96 Verdon St', '6 Agnes St'], dtype=object)
要查看唯一值列表以及它們在數據集中出現的頻率,我們可以使用value_counts方法:
melbourne_data.Address.value_counts()
5 Margaret St 3
53 William St 3
5 Charles St 3
..
9 Ambon Ct 1
2/28 Caroline St 1
174 South Rd 1
Name: Address, Length: 13378, dtype: int64
映射
“映射”是一個從數學中借用的術語,用於獲取一組值並將它們“映射”到另一組值的函數。 在數據科學中,我們經常需要從現有數據創建新的表示,或者將數據從現在的格式轉換爲我們希望它在以後的格式。 映射是處理這項工作的地方,對於完成工作非常重要!
你經常會使用兩種映射方法。 Series.map是第一個,稍微簡單一點。 例如,假設我們想要將房價重新計算爲現在價格減掉均值.我們可以這樣做:
price_mean = melbourne_data.Price.mean()
melbourne_data.Price.map(lambda p: p - price_mean)
0 4.043159e+05
1 -4.068408e+04
2 3.893159e+05
...
13577 9.431592e+04
13578 1.424316e+06
13579 2.093159e+05
Name: Price, Length: 13580, dtype: float64
傳遞給map的函數應該期望Series中的單個值(在上面的示例中爲點值),並返回該值的轉換版本。 map返回一個新Series,其中所有值都已由你的函數轉換。
如果我們想要通過在每一行上調用自定義方法來轉換整個DataFrame,DataFrame.apply是靠譜的方法。
def remean_price(row):
row.Price = row.Price - price_mean
return row
melbourne_data.apply(remean_price, axis='columns')
如果我們使用axis ='index'調用了reviews.apply,那麼我們需要提供一個函數來轉換每一列,而不是傳遞一個函數來轉換每一行。
請注意,Series.map和DataFrame.apply分別返回新的,已轉換的Series和DataFrame。 它們不會修改它們被調用的原始數據。 如果我們查看第一行房價數據,我們可以看到它仍然具有原始點值。
melbourne_data.head(1)
pandas提供許多常見的映射操作作爲內置函數。 例如,這是一種更快速的方法來重新記錄我們的點列:
price_mean = melbourne_data.Price.mean()
melbourne_data.Price - price_mean
0 4.043159e+05
1 -4.068408e+04
2 3.893159e+05
...
13577 9.431592e+04
13578 1.424316e+06
13579 2.093159e+05
Name: Price, Length: 13580, dtype: float64
在這段代碼中,我們在左側的許多值(Series中的所有內容)和右側的單個值(平均值)之間執行操作。 pandas查看此表達式並指出我們必須從數據集中的每個值中減去該平均值。
如果我們在相等長度的系列之間執行這些操作,pandas也將理解該怎麼做。 例如,在數據集中組合區縣和地址信息的簡單方法是執行以下操作:
melbourne_data.Suburb + " - " + melbourne_data.Address
0 Abbotsford - 85 Turner St
1 Abbotsford - 25 Bloomburg St
2 Abbotsford - 5 Charles St
...
13577 Williamstown - 83 Power St
13578 Williamstown - 96 Verdon St
13579 Yarraville - 6 Agnes St
Length: 13580, dtype: object
這些運算符比map或apply更快,因爲它們使用內置於pandas中的加速。 所有標準Python運算符(>,<,==等)都以這種方式工作。
然而,它們並不像map或apply那樣靈活,它可以做更高級的事情,比如應用條件邏輯,這不能僅通過加法和減法來完成。