1. 程式人生 > >機器學習 Python基礎2 Pandas DataFrame 常用方法實踐

機器學習 Python基礎2 Pandas DataFrame 常用方法實踐

Pandas DataFrame 常用方法實踐

常見的物件型別

其實在API 文件裡面有很多資料型別 Pandas API Reference

  1. Series【文章後面有說明】
  2. DataFrame【文章後面有說明】
  3. Panel
  4. Index
  5. Numeric Index
  6. CategoricalIndex
  7. IntervalIndex
  8. MultiIndex
  9. DatetimeIndex
  10. TimedeltaIndex
  11. PeriodIndex
  12. Scalars
  13. Frequencies
  14. Window
  15. GroupBy
    好像有蠻多的,這裡不一一列舉了,有空我再補充一下每個介面的作用資料

【pandas.core.series.Series】

Series物件 是一維的陣列物件,自帶了陣列的索引,與 numpy中的一維array類似
這個物件的所有方法可以參考官網 pandas.Series

"""=================================
1. 建立 Series 物件
"""
In [1]: s = pd.Series([1,2,3,4],index = ['a','b','c','d']) # 通過 list 傳入一維資料, index 屬性指定索引
In [2]: s # 輸出陣列內容 Out[2]: a 1 b 2 c 3 d 4 dtype: int64 """================================= 2. 讀取 Series 物件 的 索引和值 """ In [3]: s.index # 通過 index 輸出索引資訊 Out[3]: Index(['a', 'b', 'c', 'd'], dtype='object') In [4]: s.values # 通過 values 輸出陣列內容 Out[4]: array([1, 2, 3, 4], dtype=int64) In [5]: s*2 # 對 values 的值進行操作(索引不會改變) Out[5]: a 2 b 4 c 6 d 8 dtype: int64 """================================= 3. 對 Series 物件的值進行操作 """ In [6]: s + 1 # 對 values 的值進行操作(索引不會改變) Out[6]: a 2 b 3 c 4 d 5 dtype: int64 """================================= 4. 對 Series 物件的值進行篩選 """ In [7]: s[s > 2] # 對 values 的值篩選 Out[7]: c 3 d 4 dtype: int64 In [8]: s[s > 12] 對 values 的值篩選, 返回值是一個空的 Series Out[8]: Series([], dtype: int64)

【pandas.core.frame.DataFrame】

是一個表格型的資料結構,提供有序的列和不同型別的列值
這個物件的所有方法可以參考官網 pandas.DataFrame

"""=================================
1. 建立 DataFrame 的物件
"""
In [1]: df1 = pd.DataFrame({'col0':[1,2,3], 'col1':[4,5,6]})

In [2]: df1
Out[2]:
   col0  col1
0     1     4
1     2     5
2     3     6

In [3]: data = {'col0':[1,2,3], 'col1':[4,5,6]}  # 通過字典建立 DataFrame 物件,可以指定指點中的 key
   ...: df2 = pd.DataFrame(data,columns = ['col1'])

In [4]: df2
Out[4]:
   col1  col0
0     4     1
1     5     2
2     6     3

In [5]: df3 = pd.DataFrame(data,columns = ['col1','col0','col2']) # 如果指定不存在的key, 會使用 NaN 來補充

In [6]: df3
Out[6]:
   col1  col0 col2
0     4     1  NaN
1     5     2  NaN
2     6     3  NaN

"""=================================
2. 讀取 DataFrame 物件的某一列
"""
In [7]: df3["col1"] 
Out[7]:
0    4
1    5
2    6
Name: col1, dtype: int64

In [8]: type(df3["col1"])
Out[8]: pandas.core.series.Series

In [9]: df3.col1
Out[9]:
0    4
1    5
2    6
Name: col1, dtype: int64

"""=================================
3. 刪除 DataFrame 物件的資料
"""
In [10]: del df3['col1']

In [11]: df3
Out[11]:
   col0 col2
0     1  NaN
1     2  NaN
2     3  NaN

常用方法實踐

1) 重新索引

根據index引數重新進行排序。如果傳入的索引值在資料裡不存在,則不會報錯,而是新增缺失值的新行。不想用缺失值,可以用 fill_value 引數指定填充值。

In [1]: df1 = pd.DataFrame({'col0':[1,2,3], 'col1':[4,5,6]})

In [2]: df1
Out[2]:
   col0  col1
0     1     4
1     2     5
2     3     6

In [3]: df1.index
Out[3]: RangeIndex(start=0, stop=3, step=1)

In [4]: df2 = df1.reindex(['a','b','c'],fill_value = 0)

In [5]: df2
Out[5]:
   col0  col1
a     0     0
b     0     0
c     0     0

In [6]: df2.index
Out[6]: Index(['a', 'b', 'c'], dtype='object')

根據 Out[2] 和 Out[4] 的顯示,你會發現索引已經由 RangeIndex(start=0, stop=3, step=1) 變成了 Index([‘a’, ‘b’, ‘c’], dtype=‘object’)

#fill_value 會讓所有的缺失值都填充為同一個值,如果不想這樣而是用相鄰的元素(左或者右)的值填充,則可以用 method 引數,可選的引數值為 ffill 和 bfill,分別為用前值填充和用後值填充。

In [1]: df3 = df1.reindex(range(5),method = 'ffill')

In [2]: df3
Out[2]:
   col0  col1
0     1     4
1     2     5
2     3     6
3     3     6
4     3     6

In [4]: df3 = df1.reindex(range(5),method = 'bfill')

In [5]: df3
Out[5]:
   col0  col1
0   1.0   4.0
1   2.0   5.0
2   3.0   6.0
3   NaN   NaN
4   NaN   NaN

2) 丟棄資料

data.drop([‘idx1’,‘idx2’])#刪除行
data.drop([‘col1’,‘col2’],axis = 1) #新增axis引數刪除列

3) 索引、選取和過濾

[注意]利用索引的切片運算與普通的 Python 切片運算不同,其末端是包含的,既包含最後一個的項。

e.gobj[‘b’:‘d’]包含’d’,但是obj[1:3]不包含3
loc和iloc
df.loc[index,column_names]#知道column names 和index,且兩者都很好輸入
df.iloc[index,col_index]#column_name太長;index是時間序列不好輸入 i_index
ix操作:混合使用下標和名稱進行選取
data.ix[‘idx’,[‘col1’,‘col2’]]
data.ix[2] #第2行
data.ix[data.col1<5,:3] # data.col1<5的前2列

4) 算術運算和資料對齊

1)Series:將2個物件相加時,具有重疊索引的索引值會相加處理;不重疊的索引則取並集,值為 NA;
2)對齊操作會同時發生在行和列上,把2個物件相加會得到一個新的物件,其索引為原來2個物件的索引的並集;和Series 物件一樣,不重疊的索引會取並集,值為 NA;如果不想這樣,試試使用 add() 方法進行資料填充:
df1+df2 #會出現NaN
df1.add(df2,fill_value = 0)#無NaN

5) 函式應用和對映

df1.astype(np.int32)
df2.apply(f) #f = lambda x:x+1

6) 排序

df.sort_index(ascending = False)frame.sort_index(axis = 1)
Series: obj.sort_values()obj.sort_index()
排名
obj.rank(ascending = False) #索引位上的數的排名
帶有重複值的軸索引
obj.index.is_unique#False
索引時,同時輸出多個值

7) 彙總統計和計算

df.sum() #縱向彙總(行求和) aixs=1為橫向彙總
df.cumsum() #縱向彙總_累計彙總
df.idxmax() #獲取最大值對應的索引
obj.unique() #返回資料裡的唯一值array
obj. value_counts()#統計各值出現的頻率,返回Series索引為值
obj. isin([‘c’])#判斷成員資格,在原表基礎上修正為bool

8) 處理缺失資料

使用isnull()和notnull()函式來判斷缺失情況。
對於缺失資料一般處理方法為濾掉或者填充。
濾除缺失資料
data.dropna() #返回一個包含非空資料和索引值的表,等價於data[data.notnull()]
data.dropna(how = ‘all’) #只有行裡的資料全部為空時才丟棄,axis=1按列丟棄
填充缺失資料
df.fillna(0) #用預設值填充缺失資料
df.fillna({0:10,1:20,2:200})#可以傳入字典對不同的列填充不同的值(鍵表示列)

9) 層次化索引:能在一個數組上擁有多個索引,有點像Excel裡的合併單元格

根據索引選擇資料子集
data[‘a’] #以外層索引的方式選擇資料子集
data[:,2] #以內層索引的方式選擇資料
data.unstack() #多重索引Series轉換為DataFrame,第二層索引為列
重排分級順序
df. swaplevel(‘idx1_name’, ‘idx2_name’)#將兩個級別的資料進行交換
df. sortlevel(0,ascending = False)#以行按第一層(0)進行排序
df. sortlevel(1,ascending = False,axis=1)#列按第二層(1)進行排序
根據級別彙總統計
多層次索引的資料,彙總的時候可以單獨按照級別進行
df.sum(level=‘idx1_name’)

10) 資料合併

a)pandas.merge():資料庫風格的合併
pd.merge(df1,df2,on=‘col_coname’) #以col_coname列當作鍵,預設內連線(inner),即鍵的交集
pd.merge(df1,df2,on=‘col_coname’,how=‘left’)#左連線(left),右連線(right)和外連線並集
left.join(right) #以索引作為連線鍵

b)pandas.concat()方法:軸向連線,即沿著一條軸將多個物件堆疊到一起
pd.concat([s1,s2,s3]) #預設concat在豎軸(axis=0)上連線,即產生新的Series。

c)例項方法combine_first()方法:合併重疊資料
s1.combine_first(s2) #等價於np.where(pd.isnull(s1),s2,s1)
這是一個向量化的if-else操作,如果s1裡某個位置上的資料為空,則用s2同位置上的元素來補,你可以理解為“打補丁”操作。

11) 資料重塑/軸向旋轉

重塑指的是將資料重新排列,也叫軸向旋轉。
stack: 將資料的列“旋轉”為行。unstack:將資料的行“旋轉”為列。
處理堆疊格式
堆疊格式也叫長格式,一般關係型資料庫儲存時間序列的資料會採用此種格式
df.pivot(‘col1’,‘col2’,‘col3’)

12) 資料轉換:對資料的過濾、清理以及其他的轉換操作。

移除重複資料
df.duplicated() #檢測各行是否重複,預設判斷全部列,預設保留第一個出現的值
df.duplicated([‘col1’]) #判斷指定列
df.drop_duplicates() #丟棄重複行
df.drop_duplicates(keep=‘lost’) #或傳入take_last=True保留最後一個值

利用對映進行資料轉換
data[‘new_col’] = data[‘col1’].map(col1_to_new_col)#map到一個dict
data[‘col1’].map(lambda x: col1_to_new_col[x]) #等價於使用函式
替換值
data.replace(value,np.nan)
data.replace([value1, value2],[ np.nan,0])
重新命名軸索引
data.rename(index=str.title,columns=str.upper)
將資料劃分成不同的組
scores=[40,54,60,85,87,81]
score_levels=[0,60,80,95]
cats = pd.cut(scores,score_levels) #輸出內容為區間的列表
pd.value_counts(cats) #統計區間個數

檢測和過濾異常值
data.decsribe() #產生資料的count,mean,std,min…
data[np.abs(data)>2] #找出絕對值大於2的值,不滿足的為nan
data[np.abs(data)>2.any(1)] #找出絕對值大於2的行
data[np.abs(data)>2]=0 #將異常值設定為0