基於pandas進行數據預處理
阿新 • • 發佈:2018-07-23
連續 matrix mis timestamp head scribe range 字典 數值
很久沒用pandas,有些有點忘了,轉載一個比較完整的利用pandas進行數據預處理的博文:https://blog.csdn.net/u014400239/article/details/70846634
引入包和加載數據
1 import pandas as pd 2 import numpy as np 3 train_df =pd.read_csv(‘../datas/train.csv‘) # train set 4 test_df = pd.read_csv(‘../datas/test.csv‘) # test set 5 combine = [train_df, test_df]
清洗數據
- 查看數據維度以及類型
- 缺失值處理
- 查看object數據統計信息
- 數值屬性離散化
- 計算特征與target屬性之間關系
查看數據維度以及類型
1 #查看前五條數據 2 print train_df.head(5) 3 #查看每列數據類型以及nan情況 4 print train_df.info() 5 # 獲得所有object屬性 6 print train_data.describe().columns
查看object數據統計信息
1 #查看連續數值屬性基本統計情況 2 print train_df.describe() 3 #查看object屬性數據統計情況 4print train_df.describe(include=[‘O‘]) 5 # 統計Title單列各個元素對應的個數 6 print train_df[‘Title‘].value_counts() 7 # 屬性列刪除 8 train_df = train_df.drop([‘Name‘, ‘PassengerId‘], axis=0)
Ps.原文中axis的處理是不對的,Python中axis = 0是按列處理,axis = 1 是按行處理。
缺失值處理
1 # 直接丟棄缺失數據列的行 2 print df4.dropna(axis=1,subset=[‘col1‘]) # 丟棄nan的行,subset指定查看哪幾列 3 print df4.dropna(axis=0) # 丟棄nan的列 4 # 采用其他值填充 5 dataset[‘Cabin‘] = dataset[‘Cabin‘].fillna(‘U‘) 6 dataset[‘Title‘] = dataset[‘Title‘].fillna(0) 7 # 采用出現最頻繁的值填充 8 freq_port = train_df.Embarked.dropna().mode()[0] 9 dataset[‘Embarked‘] = dataset[‘Embarked‘].fillna(freq_port) 10 # 采用中位數或者平均數填充 11 test_df[‘Fare‘].fillna(test_df[‘Fare‘].dropna().median(), inplace=True) 12 test_df[‘Fare‘].fillna(test_df[‘Fare‘].dropna().mean(), inplace=True)
數值屬性離散化,object屬性數值化
1 # 創造一個新列,FareBand,將連續屬性Fare切分成四份 2 train_df[‘FareBand‘] = pd.qcut(train_df[‘Fare‘], 4) 3 # 查看切分後的屬性與target屬性Survive的關系 4 train_df[[‘FareBand‘, ‘Survived‘]].groupby([‘FareBand‘], as_index=False).mean().sort_values(by=‘FareBand‘, ascending=True) 5 # 建立object屬性映射字典 6 title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Royalty":5, "Officer": 6} 7 dataset[‘Title‘] = dataset[‘Title‘].map(title_mapping)
計算特征與target屬性之間關系
- object與連續target屬性之間,可以groupby均值
- object與離散target屬性之間,先將target數值化,然後groupby均值,或者分別條形統計圖
- 連續屬性需要先切割然後再進行groupby計算,或者pearson相關系數
1 print train_df[[‘AgeBand‘, ‘Survived‘]].groupby([‘AgeBand‘], as_index=False).mean().sort_values(by=‘AgeBand‘, ascending=True)
總結pandas基本操作
1 ”’ 2 創建df對象 3 ””’ 4 s1 = pd.Series([1,2,3,np.nan,4,5]) 5 s2 = pd.Series([np.nan,1,2,3,4,5]) 6 print s1 7 dates = pd.date_range(“20130101”,periods=6) 8 print dates 9 df = pd.DataFrame(np.random.rand(6,4),index=dates,columns=list(“ABCD”)) 10 # print df 11 df2 = pd.DataFrame({“A”:1, 12 ‘B’:pd.Timestamp(‘20130102’), 13 ‘C’:pd.Series(1,index=list(range(4)),dtype=’float32’), 14 ‘D’:np.array([3]*4,dtype=np.int32), 15 ‘E’:pd.Categorical([‘test’,’train’,’test’,’train’]), 16 ‘F’:’foo’ 17 }) 18 # print df2.dtypes 19 20 df3 = pd.DataFrame({‘col1‘:s1, 21 ‘col2‘:s2 22 }) 23 print df3 24 25 ‘‘‘ 26 2.查看df數據 27 ‘‘‘ 28 print df3.head(2) #查看頭幾條 29 print df3.tail(3) #查看尾幾條 30 print df.index #查看索引 31 print df.info() #查看非non數據條數 32 print type(df.values) #返回二元數組 33 # print df3.values 34 print df.describe() #對每列數據進行初步的統計 35 print df3 36 print df3.sort_values(by=[‘col1‘],axis=0,ascending=True) #按照哪幾列排序 37 38 ‘‘‘ 39 3.選擇數據 40 ‘‘‘ 41 ser_1 = df3[‘col1‘] 42 print type(ser_1) #pandas.core.series.Series 43 print df3[0:2] #前三行 44 print df3.loc[df3.index[0]] #通過index來訪問 45 print df3.loc[df3.index[0],[‘col2‘]] #通過行index,和列名來唯一確定一個位置 46 print df3.iloc[1] #通過位置來訪問 47 print df3.iloc[[1,2],1:2] #通過位置來訪問 48 print "===" 49 print df3.loc[:,[‘col1‘,‘col2‘]].as_matrix() # 返回nunpy二元數組 50 print type(df3.loc[:,[‘col1‘,‘col2‘]].as_matrix()) 51 52 ‘‘‘ 53 4.布爾索引,過濾數據 54 ‘‘‘ 55 print df3[df3.col1 >2] 56 df4 = df3.copy() 57 df4[‘col3‘]=pd.Series([‘one‘,‘two‘,‘two‘,‘three‘,‘one‘,‘two‘]) 58 print df4 59 print df4[df4[‘col3‘].isin([‘one‘,‘two‘])] 60 df4.loc[:,‘col3‘]="five" 61 print df4 62 63 ‘‘‘ 64 5.缺失值處理,pandas將缺失值用nan代替 65 ‘‘‘ 66 print pd.isnull(df4) 67 print df4.dropna(axis=0,subset=[‘col1‘]) # 丟棄nan的行,subset指定查看哪幾列 68 print df4.dropna(axis=1) # 丟棄nan的列
基於pandas進行數據預處理