Python資料處理的一些總結-1
阿新 • • 發佈:2019-02-13
import pandas as pd import numpy as np #載入資料 train=pd.read_csv('Train.csv') test=pd.read_csv('Test.csv') #顯示一下資料的大小 #可以通過train.shape, test.shape檢視 train.dtypes#檢視每個屬性的型別 train.head(5)#檢視前五條資料 #合併成一個總的data train['source']='train' test['source']='test' data=pd.concat([train, test], ignore_index=True)
注意,最後一條資料的igonore_index的屬性我來解釋一下啦
比如有兩個表myTrain.csv, myTest.csv,其中,兩個表的內容分別是:
myTrain.csv
a | b |
1 | 5 |
2 | 6 |
3 | 7 |
4 | 8 |
a | b |
1 | 5 |
2 | 6 |
3 | 7 |
4 | 8 |
data=pd.concat([train, test], ignore_index=True)
執行上面的程式碼,結果如下:
注意看前面的索引值,其實,對於myTrain.csv和myTest.csv兩個表來說都有一個自己的索引值,然後在組合的時候這邊忽略了
再看:
、
看了這個圖片就一目瞭然了,其實就是索引是否要重新開始而已
好了,我們繼續看看下面的程式碼把:
#在實際的應用中很重的是觀察異常點,比如說異常值;
data.apply(lambda x:sum(x.isnull()))
這裡看一段程式碼:
關於lambda表達是解釋:Python的lambda表示式可以看看這個部落格,隨便百度啦,很多解釋的,挺容易理解的
欄位,分別有多少種取值
var = ['Gender','Salary_Account','Mobile_Verified','Var1','Filled_Form','Device_Type','Var2','Source'] for v in var: print '\n%s這一列資料的不同取值和出現的次數\n'%v print data[v].value_counts() #看看某一個欄位與多少的不同的取值 len(data['City'].unique())#data['City'].unique()給出的結果是在該屬性下不同城市的名字都列出來 #如果要刪除該屬性,可以用下面的額程式碼 data.drop('City',axis=1,inplace=True)
需要解釋一下這裡的axis=1和,inplace了,話不多說,上圖片
明白了把,axis=0表示的是要對橫座標操作,axis=1是要對縱座標操作
inplace=False表示要對結果顯示,而True表示對結果不顯示
#DOB是出生的具體日期,咱們要具體日期作用沒那麼大,年齡段可能對我們有用,所有算一下年齡好了
#建立一個年齡的欄位Age
data['Age'] = data['DOB'].apply(lambda x: 115 - int(x[-2:]))
data.drop('DOB',axis=1,inplace=True)#刪除原先的欄位
data.boxplot(column=['EMI_Loan_Submitted'],return_type='axes')#畫出箱線圖
#好像缺失值比較多,乾脆就開一個新的欄位,表明是缺失值還是不是缺失值
data['EMI_Loan_Submitted_Missing'] = data['EMI_Loan_Submitted'].apply(lambda x: 1 if pd.isnull(x) else 0)
data[['EMI_Loan_Submitted','EMI_Loan_Submitted_Missing']].head(10)
data.drop('EMI_Loan_Submitted',axis=1,inplace=True)
#看看個數
len(data['Employer_Name'].value_counts())
#看看某一欄位的資訊
data['Existing_EMI'].describe()
#預設值不多,用均值代替
data['Existing_EMI'].fillna(0, inplace=True)
#找中位數去填補預設值(因為預設的不多)
data['Loan_Amount_Applied'].fillna(data['Loan_Amount_Applied'].median(),inplace=True)
data['Loan_Tenure_Applied'].fillna(data['Loan_Tenure_Applied'].median(),inplace=True)
#處理source
data['Source'] = data['Source'].apply(lambda x: 'others' if x not in ['S122','S133'] else x)
data['Source'].value_counts()
#數值編碼
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
var_to_encode = ['Device_Type','Filled_Form','Gender','Var1','Var2','Mobile_Verified','Source']
for col in var_to_encode:
data[col] = le.fit_transform(data[col])
解釋一下data[col] = le.fit_transform(data[col]),看圖:原來的讀入檔案是:
來編碼啦,繼續看圖:
明白了,就是給不同的數字編碼呀,起到區分作用的
關鍵部分的程式碼如下
import pandas as pd
import numpy as np
#載入資料
train=pd.read_csv('Train.csv')
test=pd.read_csv('Test.csv')
#顯示一下資料的大小
#可以通過train.shape, test.shape檢視
train.dtypes#檢視每個屬性的型別
train.head(5)#檢視前五條資料
#合併成一個總的data
train['source']='train'
test['source']='test'
data=pd.concat([train, test], ignore_index=True)
#在實際的應用中很重的是觀察異常點,比如說異常值;
data.apply(lambda x:sum(x.isnull()))
#要對資料有更深的認識,比如說,咱們看看這些欄位,分別有多少種取值(甚至你可以看看分佈)
var = ['Gender','Salary_Account','Mobile_Verified','Var1','Filled_Form','Device_Type','Var2','Source']
for v in var:
print '\n%s這一列資料的不同取值和出現的次數\n'%v
print data[v].value_counts()
#看看某一個欄位與多少的不同的取值
len(data['City'].unique())#data['City'].unique()給出的結果是在該屬性下不同城市的名字都列出來
#如果要刪除該屬性,可以用下面的額程式碼
data.drop('City',axis=1,inplace=True)
#DOB是出生的具體日期,咱們要具體日期作用沒那麼大,年齡段可能對我們有用,所有算一下年齡好了
#建立一個年齡的欄位Age
data['Age'] = data['DOB'].apply(lambda x: 115 - int(x[-2:]))
data.drop('DOB',axis=1,inplace=True)#刪除原先的欄位
data.boxplot(column=['EMI_Loan_Submitted'],return_type='axes')#畫出箱線圖
#好像缺失值比較多,乾脆就開一個新的欄位,表明是缺失值還是不是缺失值
data['EMI_Loan_Submitted_Missing'] = data['EMI_Loan_Submitted'].apply(lambda x: 1 if pd.isnull(x) else 0)
data[['EMI_Loan_Submitted','EMI_Loan_Submitted_Missing']].head(10)
data.drop('EMI_Loan_Submitted',axis=1,inplace=True)
#看看個數
len(data['Employer_Name'].value_counts())
#看看某一欄位的資訊
data['Existing_EMI'].describe()
#預設值不多,用均值代替
data['Existing_EMI'].fillna(0, inplace=True)
#找中位數去填補預設值(因為預設的不多)
data['Loan_Amount_Applied'].fillna(data['Loan_Amount_Applied'].median(),inplace=True)
data['Loan_Tenure_Applied'].fillna(data['Loan_Tenure_Applied'].median(),inplace=True)
#處理source
data['Source'] = data['Source'].apply(lambda x: 'others' if x not in ['S122','S133'] else x)
data['Source'].value_counts()
#數值編碼
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
var_to_encode = ['Device_Type','Filled_Form','Gender','Var1','Var2','Mobile_Verified','Source']
for col in var_to_encode:
data[col] = le.fit_transform(data[col])
#類別型的One-Hot 編碼
data = pd.get_dummies(data, columns=var_to_encode)
data.columns#看看one-hot編碼後的列是哪些
#區分訓練和測試資料
train = data.loc[data['source']=='train']
test = data.loc[data['source']=='test']
train.drop('source',axis=1,inplace=True)
#儲存程式碼
train.to_csv('train_modified.csv',index=False)
test.to_csv('test_modified.csv',index=False)