1. 程式人生 > >基於pandas進行數據預處理

基於pandas進行數據預處理

連續 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屬性數據統計情況
4
print 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進行數據預處理