python數據分析入門——數據導入數據預處理基本操作


數據導入到python環境:http://pandas.pydata.org/pandas-docs/stable/io.html(英文版)

IO Tools (Text, CSV, HDF5, ...)

The pandas I/O API is a set of top level reader functions accessed like pd.read_csv() that generally return a pandasobject.

The corresponding writer functions are object methods that are accessed like df.to_csv()

Here is an informal performance comparison for some of these IO methods.

Note

 

For examples that use the StringIO class, make sure you import it according to your Python version, i.e.from StringIO import StringIO for Python 2 and from io import StringIO for Python 3.

中文版read_csv參數詳解:

pandas.read_csv參數詳解

 
pandas.read_csv參數整理
 
讀取CSV(逗號分割)文件到DataFrame
也支持文件的部分導入和選擇迭代
參數:
filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
可以是URL,可用URL類型包括:http, ftp, s3和文件。對於多文件正在准備中
本地文件讀取實例:://localhost/path/to/table.csv
 
sep : str, default ‘,’
指定分隔符。如果不指定參數,則會嘗試使用逗號分隔。分隔符長於一個字符並且不是‘\s+’,將使用python的語法分析器。並且忽略數據中的逗號。正則表達式例子:'\r\t'
 
delimiter : str, default None
定界符,備選分隔符(如果指定該參數,則sep參數失效)
 
delim_whitespace : boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作為分隔符使用,等效於設定sep='\s+'。如果這個參數設定為Ture那么delimiter 參數失效。
在新版本0.18.1支持
 
header : int or list of ints, default ‘infer’
指定行數用來作為列名,數據開始行數。如果文件中沒有列名,則默認為0,否則設置為None。如果明確設定header=0 就會替換掉原來存在列名。header參數可以是一個list例如:[0,1,3],這個list表示將文件中的這些行作為列標題(意味着每一列有多個標題),介於中間的行將被忽略掉(例如本例中的2;本例中的數據1,2,4行將被作為多級標題出現,第3行數據將被丟棄,dataframe的數據從第5行開始。)。
注意:如果skip_blank_lines=True 那么header參數忽略注釋行和空行,所以header=0表示第一行數據而不是文件的第一行。
 
names : array-like, default None
用於結果的列名列表,如果數據文件中沒有列標題行,就需要執行header=None。默認列表中不能出現重復,除非設定參數mangle_dupe_cols=True。
 
index_col : int or sequence or False, default None
用作行索引的列編號或者列名,如果給定一個序列則有多個行索引。
如果文件不規則,行尾有分隔符,則可以設定index_col=False 來是的pandas不適用第一列作為行索引。
 
usecols : array-like, default None
返回一個數據子集,該列表中的值必須可以對應到文件中的位置(數字可以對應到指定的列)或者是字符傳為文件中的列名。例如:usecols有效參數可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用這個參數可以加快加載速度並降低內存消耗。
 
as_recarray : boolean, default False
不贊成使用:該參數會在未來版本移除。請使用pd.read_csv(...).to_records()替代。
返回一個Numpy的recarray來替代DataFrame。如果該參數設定為True。將會優先squeeze參數使用。並且行索引將不再可用,索引列也將被忽略。
 
squeeze : boolean, default False
如果文件值包含一列,則返回一個Series
 
prefix : str, default None
在沒有列標題時,給列添加前綴。例如:添加‘X’ 成為 X0, X1, ...
 
mangle_dupe_cols : boolean, default True
重復的列,將‘X’...’X’表示為‘X.0’...’X.N’。如果設定為false則會將所有重名列覆蓋。
 
dtype : Type name or dict of column -> type, default None
每列數據的數據類型。例如 {‘a’: np.float64, ‘b’: np.int32}
 
engine : {‘c’, ‘python’}, optional
Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.
使用的分析引擎。可以選擇C或者是python。C引擎快但是Python引擎功能更加完備。
 
converters : dict, default None
列轉換函數的字典。key可以是列名或者列的序號。
 
true_values : list, default None
Values to consider as True
 
false_values : list, default None
Values to consider as False
 
skipinitialspace : boolean, default False
忽略分隔符后的空白(默認為False,即不忽略).
 
skiprows : list-like or integer, default None
需要忽略的行數(從文件開始處算起),或需要跳過的行號列表(從0開始)。
 
skipfooter : int, default 0
從文件尾部開始忽略。 (c引擎不支持)
 
skip_footer : int, default 0
不推薦使用:建議使用skipfooter ,功能一樣。
 
nrows : int, default None
需要讀取的行數(從文件頭開始算起)。
 
na_values : scalar, str, list-like, or dict, default None
一組用於替換NA/NaN的值。如果傳參,需要制定特定列的空值。默認為‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.
 
keep_default_na : bool, default True
如果指定na_values參數,並且keep_default_na=False,那么默認的NaN將被覆蓋,否則添加。
 
na_filter : boolean, default True
是否檢查丟失值(空字符串或者是空值)。對於大文件來說數據集中沒有空值,設定na_filter=False可以提升讀取速度。
 
verbose : boolean, default False
是否打印各種解析器的輸出信息,例如:“非數值列中缺失值的數量”等。
 
skip_blank_lines : boolean, default True
如果為True,則跳過空行;否則記為NaN。
 
parse_dates : boolean or list of ints or names or list of lists or dict, default False
  • boolean. True -> 解析索引
  • list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作為獨立的日期列;
  • list of lists. e.g. If [[1, 3]] -> 合並1,3列作為一個日期列使用
  • dict, e.g. {‘foo’ : [1, 3]} -> 將1,3列合並,並給合並后的列起名為"foo"
 
infer_datetime_format : boolean, default False
如果設定為True並且parse_dates 可用,那么pandas將嘗試轉換為日期類型,如果可以轉換,轉換方法並解析。在某些情況下會快5~10倍。
 
keep_date_col : boolean, default False
如果連接多列解析日期,則保持參與連接的列。默認為False。
 
date_parser : function, default None
用於解析日期的函數,默認使用dateutil.parser.parser來做轉換。Pandas嘗試使用三種不同的方式解析,如果遇到問題則使用下一種方式。
1.使用一個或者多個arrays(由parse_dates指定)作為參數;
2.連接指定多列字符串作為一個列作為參數;
3.每行調用一次date_parser函數來解析一個或者多個字符串(由parse_dates指定)作為參數。
 
dayfirst : boolean, default False
DD/MM格式的日期類型
 
iterator : boolean, default False
返回一個TextFileReader 對象,以便逐塊處理文件。
 
chunksize : int, default None
文件塊的大小,  See IO Tools docs for more informationon iterator and chunksize.
 
compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
直接使用磁盤上的壓縮文件。如果使用infer參數,則使用 gzip, bz2, zip或者解壓文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’這些為后綴的文件,否則不解壓。如果使用zip,那么ZIP包中國必須只包含一個文件。設置為None則不解壓。
新版本0.18.1版本支持zip和xz解壓
 
thousands : str, default None
千分位分割符,如“,”或者“."
 
decimal : str, default ‘.’
字符中的小數點 (例如:歐洲數據使用’,‘).
 
float_precision : string, default None
Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter.
指定
 
lineterminator : str (length 1), default None
行分割符,只在C解析器下使用。
 
quotechar : str (length 1), optional
引號,用作標識開始和解釋的字符,引號內的分割符將被忽略。
 
quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引號常量。可選 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
 
doublequote : boolean, default True
雙引號,當單引號已經被定義,並且quoting 參數不是QUOTE_NONE的時候,使用雙引號表示引號內的元素作為一個元素使用。
 
escapechar : str (length 1), default None
當quoting 為QUOTE_NONE時,指定一個字符使的不受分隔符限值。
 
comment : str, default None
標識着多余的行不被解析。如果該字符出現在行首,這一行將被全部忽略。這個參數只能是一個字符,空行(就像skip_blank_lines=True)注釋行被header和skiprows忽略一樣。例如如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回結果將是以’a,b,c'作為header。
 
encoding : str, default None
指定字符集類型,通常指定為'utf-8'.  List of Python standard encodings
 
dialect : str or csv.Dialect instance, default None
如果沒有指定特定的語言,如果sep大於一個字符則忽略。具體查看csv.Dialect 文檔
 
tupleize_cols : boolean, default False
Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)
 
error_bad_lines : boolean, default True
如果一行包含太多的列,那么默認不會返回DataFrame ,如果設置成false,那么會將改行剔除(只能在C解析器下使用)。
 
warn_bad_lines : boolean, default True
如果error_bad_lines =False,並且warn_bad_lines =True 那么所有的“bad lines”將會被輸出(只能在C解析器下使用)。
 
low_memory : boolean, default True
分塊加載到內存,再低內存消耗中解析。但是可能出現類型混淆。確保類型不被混淆需要設置為False。或者使用dtype 參數指定類型。注意使用chunksize 或者iterator 參數分塊讀入會將整個文件讀入到一個Dataframe,而忽略類型(只能在C解析器中有效)
 
buffer_lines : int, default None
不推薦使用,這個參數將會在未來版本移除,因為他的值在解析器中不推薦使用
 
compact_ints : boolean, default False
不推薦使用,這個參數將會在未來版本移除
如果設置compact_ints=True ,那么任何有整數類型構成的列將被按照最小的整數類型存儲,是否有符號將取決於use_unsigned 參數
 
use_unsigned : boolean, default False
不推薦使用:這個參數將會在未來版本移除
如果整數列被壓縮(i.e. compact_ints=True),指定被壓縮的列是有符號還是無符號的。
memory_map : boolean, default False
如果使用的文件在內存內,那么直接map文件使用。使用這種方式可以避免文件再次進行IO操作。
 
 
數據預處理過程:http://www.kuqin.com/shuoit/20160206/350580.html

導語

Python正迅速成為數據科學家偏愛的語言,這合情合理。它擁有作為一種編程語言廣闊的生態環境以及眾多優秀的科學計算庫。如果你剛開始學習Python,可以先了解一下Python的學習路線。
在眾多的科學計算庫中,我認為Pandas對數據科學運算最有用。Pandas,加上Scikit-learn幾乎能構成了數據科學家所需的全部工具。本文旨在提供Python數據處理的12種方法。文中也分享了一些會讓你的工作更加便捷的小技巧。
在繼續推進之前,我推薦讀者閱覽一些關於數據探索 (data exploration)的代碼。
為了幫助理解,本文用一個具體的數據集進行運算和操作。本文使用了貸款預測(loan prediction) 問題數據集,下載數據集請到http://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction。

開始工作

首先我要導入要用的模塊,並把數據集載入Python環境。

 import pandas as pd  import numpy as np  data = pd.read_csv("train.csv", index_col="Loan_ID") 

1.布爾索引(Boolean Indexing)

如何你想用基於某些列的條件篩選另一列的值,你會怎么做?例如,我們想要一個全部無大學學歷但有貸款的女性列表。這里可以使用布爾索引。代碼如下:


 data.loc[(data["Gender"]=="Female") & (data["Education"]=="Not 
Graduate") & (data["Loan_Status"]=="Y"), 
["Gender","Education","Loan_Status"]] 


想了解更多請閱讀 Pandas Selecting and Indexing

2.Apply函數

Apply是擺弄數據和創造新變量時常用的一個函數。Apply把函數應用於數據框的特定行/列之后返回一些值。這里的函數既可以是系統自帶的也可以是用戶定義的。例如,此處可以用它來尋找每行每列的缺失值個數:


 #創建一個新函數:  def num_missing(x):    return sum(x.isnull())  #Apply到每一列:  
print "Missing values per column:"  print data.apply(num_missing, 
axis=0) #axis=0代表函數應用於每一列  #Apply到每一行:  print "nMissing values per row:"
  print data.apply(num_missing, axis=1).head() #axis=1代表函數應用於每一行 

輸出結果:

由此我們得到了想要的結果。
注意:第二個輸出使用了head()函數,因為數據包含太多行。
想了解更多請閱讀 Pandas Reference (apply)

3.替換缺失值

‘fillna()’ 可以一次解決這個問題。它被用來把缺失值替換為所在列的平均值/眾數/中位數。

 #首先導入一個尋找眾數的函數:  from scipy.stats import mode  mode(data['Gender']) 

輸出: ModeResult(mode=array([‘Male’], dtype=object), count=array([489]))
返回了眾數及其出現次數。記住,眾數可以是個數組,因為高頻的值可能不只一個。我們通常默認使用第一個:

 mode(data['Gender']).mode[0] 


現在可以填補缺失值,並用上一步的技巧來檢驗。


 #值替換:  data['Gender'].fillna(mode(data['Gender']).mode[0], 
inplace=True)  data['Married'].fillna(mode(data['Married']).mode[0], 
inplace=True)  
data['Self_Employed'].fillna(mode(data['Self_Employed']).mode[0], 
inplace=True)  #再次檢查缺失值以確認:  print data.apply(num_missing, axis=0) 


由此可見,缺失值確定被替換了。請注意這是最基本的替換方式,其他更復雜的技術,如為缺失值建模、用分組平均數(平均值/眾數/中位數)填充,會在今后的文章提到。
想了解更多請閱讀 Pandas Reference (fillna)

4.透視表

Pandas可以用來創建 Excel式的透視表。例如,“LoanAmount”這個重要的列有缺失值。我們可以用根據 ‘Gender’、‘Married’、‘Self_Employed’分組后的各組的均值來替換缺失值。每個組的 ‘LoanAmount’可以用如下方法確定:


 #Determine pivot table  impute_grps = 
data.pivot_table(values=["LoanAmount"], 
index=["Gender","Married","Self_Employed"], aggfunc=np.mean)  print 
impute_grps 


想了解更多請閱讀 Pandas Reference (Pivot Table)

5.多重索引

你可能注意到上一步驟的輸出有個奇怪的性質。每個索引都是由三個值組合而成。這叫做多重索引。它可以幫助運算快速進行。
延續上面的例子,現在我們有了每個分組的值,但還沒有替換。這個任務可以用現在學過的多個技巧共同完成。


 #只在帶有缺失值的行中迭代:  for i,row in 
data.loc[data['LoanAmount'].isnull(),:].iterrows():    ind = 
tuple([row['Gender'],row['Married'],row['Self_Employed']])    
data.loc[i,'LoanAmount'] = impute_grps.loc[ind].values[0]  #再次檢查缺失值以確認: 
 print data.apply(num_missing, axis=0) 


注:

多重索引需要在loc中用到定義分組group的元組(tuple)。這個元組會在函數中使用。
需要使用.values[0]后綴。因為默認情況下元素返回的順序與原數據庫不匹配。在這種情況下,直接指派會返回錯誤。

6. 二維表

這個功能可被用來獲取關於數據的初始“印象”(觀察)。這里我們可以驗證一些基本假設。例如,本例中“Credit_History” 被認為對欠款狀態有顯著影響。可以用下面這個二維表進行驗證:

 pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True) 


這些數字是絕對數值。不過,百分比數字更有助於快速了解數據。我們可以用apply函數達到目的:


 def percConvert(ser):    return ser/float(ser[-1])    
pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert,
 axis=1) 


現在可以很明顯地看出,有信用記錄的人獲得貸款的可能性更高:有信用記錄的人有80% 獲得了貸款,沒有信用記錄的人只有 9% 獲得了貸款。
但不僅僅是這樣,其中還包含着更多信息。由於我現在知道了有信用記錄與否非常重要,如果用信用記錄來預測是否會獲得貸款會怎樣?令人驚訝的是,在614次試驗中我們能預測正確460次,足足有75%!
如果此刻你在納悶,我們要統計模型有什么用,我不會怪你。但相信我,在此基礎上提高0.001%的准確率都是充滿挑戰性的。你是否願意接受這個挑戰?
注:對訓練集而言是75% 。在測試集上有些不同,但結果相近。同時,我希望這個例子能讓人明白,為什么提高0.05% 的正確率就能在Kaggle排行榜上跳升500個名次。
想了解更多請閱讀Pandas Reference (crosstab)

用 Python 做數據處理必看:12 個使效率倍增的 Pandas 技巧(上)《用 Python 做數據處理必看:12 個使效率倍增的 Pandas 技巧》

7 – 數據框合並

當我們有收集自不同來源的數據時,合並數據框就變得至關重要。假設對於不同的房產類型,我們有不同的房屋均價數據。讓我們定義這樣一個數據框:

 prop_rates = pd.DataFrame([1000, 5000, 12000], index=['Rural','Semiurban','Urban'],columns=['rates'])  prop_rates 


現在可以把它與原始數據框合並:


 data_merged = data.merge(right=prop_rates, 
how='inner',left_on='Property_Area',right_index=True, sort=False)  
data_merged.pivot_table(values='Credit_History',index=['Property_Area','rates'],
 aggfunc=len) 


這張透視表驗證了合並成功。注意這里的 ‘values’無關緊要,因為我們只是單純計數。
想了解更多請閱讀Pandas Reference (merge)

8 – 給數據框排序

Pandas可以輕松基於多列排序。方法如下:


 data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'],
 ascending=False)  
data_sorted[['ApplicantIncome','CoapplicantIncome']].head(10) 


注:Pandas 的“sort”函數現在已經不推薦使用,我們用 “sort_values”函數代替。
想了解更多請閱讀Pandas Reference (sort_values)

9 – 繪圖(箱型圖&直方圖)

許多人可能沒意識到Pandas可以直接繪制箱型圖和直方圖,不必單獨調用matplotlib。只需要一行代碼。舉例來說,如果我們想根據貸款狀態Loan_Status來比較申請者收入ApplicantIncome:

 data.boxplot(column="ApplicantIncome",by="Loan_Status") 

 data.hist(column="ApplicantIncome",by="Loan_Status",bins=30) 


可以看出獲得/未獲得貸款的人沒有明顯的收入差異,即收入不是決定性因素。
想了解更多請閱讀Pandas Reference (hist) | Pandas Reference (boxplot)

10 – 用Cut函數分箱

有時把數值聚集在一起更有意義。例如,如果我們要為交通狀況(路上的汽車數量)根據時間(分鍾數據)建模。具體的分鍾可能不重要,而時段如“上午”“下午”“傍晚”“夜間”“深夜”更有利於預測。如此建模更直觀,也能避免過度擬合。
這里我們定義一個簡單的、可復用的函數,輕松為任意變量分箱。


 #分箱:  def binning(col, cut_points, labels=None):    #Define min and max
 values:    minval = col.min()    maxval = col.max()    
#利用最大值和最小值創建分箱點的列表    break_points = [minval] + cut_points + [maxval]   
 #如果沒有標簽,則使用默認標簽0 ... (n-1)    if not labels:      labels = 
range(len(cut_points)+1)    #使用pandas的cut功能分箱    colBin = 
pd.cut(col,bins=break_points,labels=labels,include_lowest=True)    
return colBin    #為年齡分箱:  cut_points = [90,140,190]  labels = 
["low","medium","high","very high"]  data["LoanAmount_Bin"] = 
binning(data["LoanAmount"], cut_points, labels)  print 
pd.value_counts(data["LoanAmount_Bin"], sort=False) 


想了解更多請閱讀 Pandas Reference (cut)

11 – 為分類變量編碼

有時,我們會面對要改動分類變量的情況。原因可能是:

有些算法(如羅吉斯回歸)要求所有輸入項目是數字形式。所以分類變量常被編碼為0, 1….(n-1)
有時同一個分類變量可能會有兩種表現方式。如,溫度可能被標記為“High”, “Medium”, “Low”,“H”, “low”。這里 “High” 和 “H”都代表同一類別。同理, “Low” 和“low”也是同一類別。但Python會把它們當作不同的類別。
一些類別的頻數非常低,把它們歸為一類是個好主意。

這里我們定義了一個函數,以字典的方式輸入數值,用‘replace’函數進行編碼。


 #使用Pandas replace函數定義新函數:  def coding(col, codeDict):    colCoded = 
pd.Series(col, copy=True)    for key, value in codeDict.items():      
colCoded.replace(key, value, inplace=True)    return colCoded   ​  
#把貸款狀態LoanStatus編碼為Y=1, N=0:  print 'Before Coding:'  print 
pd.value_counts(data["Loan_Status"])  data["Loan_Status_Coded"] = 
coding(data["Loan_Status"], {'N':0,'Y':1})  print 'nAfter Coding:'  
print pd.value_counts(data["Loan_Status_Coded"]) 


編碼前后計數不變,證明編碼成功。
想了解更多請閱讀 Pandas Reference (replace)

12 – 在一個數據框的各行循環迭代

這不是一個常見的操作。但你總不想卡在這里吧?有時你會需要用一個for循環來處理每行。例如,一個常見的問題是變量處置不當。通常見於以下情況:

帶數字的分類變量被當做數值。
(由於出錯)帶文字的數值變量被當做分類變量。

所以通常來說手動定義變量類型是個好主意。如我們檢查各列的數據類型:

 #檢查當前數據類型:  data.dtypes 


這里可以看到分類變量Credit_History被當作浮點數。對付這個問題的一個好辦法是創建一個包含變量名和類型的csv文件。通過這種方法,我們可以定義一個函數來讀取文件,並為每列指派數據類型。舉例來說,我們創建了csv文件datatypes.csv

 
 #載入文件:  colTypes = pd.read_csv('datatypes.csv')  print colTypes 


載入這個文件之后,我們能對每行迭代,把用‘type’列把數據類型指派到‘feature’ 列對應的項目。


 #迭代每行,指派變量類型。  #注,astype用來指定變量類型。  for i, row in colTypes.iterrows(): 
#i: dataframe索引; row: 連續的每行      if row['feature']=="categorical":      
data[row['feature']]=data[row['feature']].astype(np.object)    elif 
row['feature']=="continuous":      
data[row['feature']]=data[row['feature']].astype(np.float)    print 
data.dtypes 

現在信用記錄這一列的類型已經成了‘object’ ,這在Pandas中代表分類變量。
想了解更多請閱讀Pandas Reference (iterrows)

結語

本文中我們介紹了多個可以幫助我們減輕數據探索、特征工程工作負擔的函數。此外,我們也定義了一些函數,這些函數可以在不同的數據集上復用以獲得相同效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM