統計摘要
摘要統計包括平均值、四分位數和標準差。.describe 方法將在DataFrame中的所有數字列上計算這些測量值。
1. 加載數據集:
>>> import pandas as pd>>> import numpy as np>>> fueleco = pd.read_csv("data/vehicles.csv.zip")>>> fueleco barrels08 barrelsA08 ... phevHwy phevComb0 15.695714 0.0 ... 0 01 29.964545 0.0 ... 0 02 12.207778 0.0 ... 0 03 29.964545 0.0 ... 0 04 17.347895 0.0 ... 0 0... ... ... ... ... ...39096 14.982273 0.0 ... 0 039097 14.330870 0.0 ... 0 039098 15.695714 0.0 ... 0 039099 15.695714 0.0 ... 0 039100 18.311667 0.0 ... 0 02. 調用個別摘要統計方法,如 .mean, .std , 和 .quantile :
>>> fueleco.mean() barrels08 17.442712barrelsA08 0.219276charge120 0.000000charge240 0.029630city08 18.077799 ... youSaveSpend -3459.572645charge240b 0.005869phevCity 0.094703phevHwy 0.094269phevComb 0.094141Length: 60, dtype: float64>>> fueleco.std() barrels08 4.580230barrelsA08 1.143837charge120 0.000000charge240 0.487408city08 6.970672 ... youSaveSpend 3010.284617charge240b 0.165399phevCity 2.279478phevHwy 2.191115phevComb 2.226500Length: 60, dtype: float64>>> fueleco.quantile(... [0, 0.25, 0.5, 0.75, 1]... ) barrels08 barrelsA08 ... phevHwy phevComb0.00 0.060000 0.000000 ... 0.0 0.00.25 14.330870 0.000000 ... 0.0 0.00.50 17.347895 0.000000 ... 0.0 0.00.75 20.115000 0.000000 ... 0.0 0.01.00 47.087143 18.311667 ... 81.0 88.03. 調用 .describe 方法:
>>> fueleco.describe() barrels08 barrelsA08 ... phevHwy phevCombcount 39101.00... 39101.00... ... 39101.00... 39101.00...mean 17.442712 0.219276 ... 0.094269 0.094141std 4.580230 1.143837 ... 2.191115 2.226500min 0.060000 0.000000 ... 0.000000 0.00000025% 14.330870 0.000000 ... 0.000000 0.00000050% 17.347895 0.000000 ... 0.000000 0.00000075% 20.115000 0.000000 ... 0.000000 0.000000max 47.087143 18.311667 ... 81.000000 88.0000004. 要獲得對象列的匯總統計,使用 .include 參數:
>>> fueleco.describe(include=object) drive eng_dscr ... modifiedOn startStopcount 37912 23431 ... 39101 7405unique 7 545 ... 68 2top Front-Wh... (FFS) ... Tue Jan ... Nfreq 13653 8827 ... 29438 5176我做過數據分析培訓,在教完客戶關於.describe方法後,客戶簡直要拍腦袋了。當我問問題出在哪裡時,他們回答說,他們已經花了幾周的時間為他們的資料庫實現了這種行為。
默認情況下,.describe會對數字列計算摘要統計。你可以通過include參數來告訴該方法包含非數字數據類型。請注意,這將顯示對象列的唯一值的計數、最頻繁的值(頂部)及其頻率計數。
有一個小竅門,往往能讓更多的數據出現在屏幕上,那就是轉置一個DataFrame。我發現這對.describe方法的輸出很有用:
>>> fueleco.describe().T count mean ... 75% maxbarrels08 39101.0 17.442712 ... 20.115 47.087143barrelsA08 39101.0 0.219276 ... 0.000 18.311667charge120 39101.0 0.000000 ... 0.000 0.000000charge240 39101.0 0.029630 ... 0.000 12.000000city08 39101.0 18.077799 ... 20.000 150.000000... ... ... ... ... ...youSaveSpend 39101.0 -3459.572645 ... -1500.000 5250.000000charge240b 39101.0 0.005869 ... 0.000 7.000000phevCity 39101.0 0.094703 ... 0.000 97.000000phevHwy 39101.0 0.094269 ... 0.000 81.000000phevComb 39101.0 0.094141 ... 0.000 88.000000列的類型
你可以簡單地通過觀察列的類型來搜集pandas中數據的信息。在這個配方中,我們將探索列的類型。
1. 檢查 .dtypes 屬性:
>>> fueleco.dtypesbarrels08 float64barrelsA08 float64charge120 float64charge240 float64city08 int64 ... modifiedOn objectstartStop objectphevCity int64phevHwy int64phevComb int64Length: 83, dtype: object2. 總結列的類型:
>>> fueleco.dtypes.value_counts()float64 32int64 27object 23bool 1dtype: int64當你用pandas讀取一個CSV文件時,它必須推斷出列的類型。這個過程看起來是這樣的:
請注意,如果你使用parse_dates,參數,有可能有些列被轉換為datetimes。
通過查看.dtypes的輸出,我可以了解到更多關於數據的信息,而不僅僅是數據類型。我可以看到某些數據是否是字符串或缺失的值。對象類型可能是字符串或分類數據,但也可能是類似數字的值,需要推敲一下,使其成為數字。我通常不考慮整數列。我傾向於將它們作為連續值來處理。如果值是浮點值,這說明該列可以是:
浮點值有缺失值
缺少一些值的整數值,因此被轉換為浮動值。
當pandas將列轉換為浮點數或整數時,它使用這些類型的64位版本。如果你知道你的整數未能進入某個範圍(或者你願意在浮點數上犧牲一些精度),你可以通過將這些列轉換為使用較少內存的列來節省一些內存。
>>> fueleco.select_dtypes("int64").describe().T count mean ... 75% maxcity08 39101.0 18.077799 ... 20.0 150.0cityA08 39101.0 0.569883 ... 0.0 145.0co2 39101.0 72.538989 ... -1.0 847.0co2A 39101.0 5.543950 ... -1.0 713.0comb08 39101.0 20.323828 ... 23.0 136.0... ... ... ... ... ...year 39101.0 2000.635406 ... 2010.0 2018.0youSaveSpend 39101.0 -3459.572645 ... -1500.0 5250.0phevCity 39101.0 0.094703 ... 0.0 97.0phevHwy 39101.0 0.094269 ... 0.0 81.0phevComb 39101.0 0.094141 ... 0.0 88.0我們可以看到,city08和comb08列的值不超過150。NumPy中的iinfo函數會向我們展示整數類型的限制。我們不想為這一列使用int8,但我們可以使用int16。通過轉換為該類型,該列將使用25%的內存。
>>> np.iinfo(np.int8)iinfo(min=-128, max=127, dtype=int8)>>> np.iinfo(np.int16)iinfo(min=-32768, max=32767, dtype=int16)>>> fueleco[["city08", "comb08"]].info(memory_usage="deep")<class 'pandas.core.frame.DataFrame'>RangeIndex: 39101 entries, 0 to 39100Data columns (total 2 columns): --- - ---- 0 city08 39101 non-null int64 1 comb08 39101 non-null int64dtypes: int64(2)memory usage: 611.1 KB>>> (... fueleco[["city08", "comb08"]]... .assign(... city08=fueleco.city08.astype(np.int16),... comb08=fueleco.comb08.astype(np.int16),... )... .info(memory_usage="deep")... )<class 'pandas.core.frame.DataFrame'>RangeIndex: 39101 entries, 0 to 39100Data columns (total 2 columns): --- - ---- 0 city08 39101 non-null int16 1 comb08 39101 non-null int16dtypes: int16(2)memory usage: 152.9 KB請注意,在NumPy中也有一個類似的finfo函數用於檢索float信息。
對於字符串列來說,節約內存的一個選擇是將它們轉換為類別。如果一個字符串列的每個值都是唯一的,這將會減慢pandas的速度,並使用更多的內存,但如果你的cardinality很低,你可以節省很多內存。make列的cardinality較低,但model列的cardinality較高,該列的內存節省較少。
下面,我們將演示只拉出這兩列。但我們不會得到一個Series,而是會用一個只包含該列名的列表做索引。這將給我們返回一個有單列的DataFrame。我們將更新列類型為分類,並查看內存使用情況。記住要傳入memory_usage='deep'來獲取對象列的內存使用情況。
>>> fueleco.make.nunique()134>>> fueleco.model.nunique()3816>>> fueleco[["make"]].info(memory_usage="deep")<class 'pandas.core.frame.DataFrame'>RangeIndex: 39101 entries, 0 to 39100Data columns (total 1 columns): --- - ---- 0 make 39101 non-null objectdtypes: object(1)memory usage: 2.4 MB>>> (... fueleco[["make"]]... .assign(make=fueleco.make.astype("category"))... .info(memory_usage="deep")... )<class 'pandas.core.frame.DataFrame'>RangeIndex: 39101 entries, 0 to 39100Data columns (total 1 columns): --- - ---- 0 make 39101 non-null categorydtypes: category(1)memory usage: 90.4 KB>>> fueleco[["model"]].info(memory_usage="deep")<class 'pandas.core.frame.DataFrame'>RangeIndex: 39101 entries, 0 to 39100Data columns (total 1 columns): --- - ---- 0 model 39101 non-null objectdtypes: object(1)memory usage: 2.5 MB>>> (... fueleco[["model"]]... .assign(model=fueleco.model.astype("category"))... .info(memory_usage="deep")... )<class 'pandas.core.frame.DataFrame'>RangeIndex: 39101 entries, 0 to 39100Data columns (total 1 columns): --- - ---- 0 model 39101 non-null categorydtypes: category(1)memory usage: 496.7 KB