機器學習 Python基礎2 Pandas DataFrame 常用方法實踐
Pandas DataFrame 常用方法實踐
常見的物件型別
其實在API 文件裡面有很多資料型別 Pandas API Reference
- Series【文章後面有說明】
- DataFrame【文章後面有說明】
- Panel
- Index
- Numeric Index
- CategoricalIndex
- IntervalIndex
- MultiIndex
- DatetimeIndex
- TimedeltaIndex
- PeriodIndex
- Scalars
- Frequencies
- Window
- 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