Python之DataFrame常用方法小結
【Series】
性質:一維陣列物件,類似NumPy 的一維array。
(除了包含一組資料還包含一組索引,所以可以把它理解為一組帶索引的陣列。)
obj = Series([1,2,3,4], index = ['a', 'b', 'c', 'd']) | # 通過 index 引數顯示指定索引 |
obj.index、obj.values | # 單獨獲取 Series 物件的索引或者陣列內容 |
obj*2、obj+1、obj[obj>10] | # 對Series物件的運算(索引不變) |
from pandas import Series obj = Series([1,2,3,4], index = ['a', 'b', 'c', 'd']) > obj a 1 b 2 c 3 d 4 dtype: int64 > obj.index Index(['a', 'b', 'c', 'd'], dtype='object') > obj.values array([1, 2, 3, 4], dtype=int64) > obj*2 a 2 b 4 c 6 d 8 dtype: int64 > obj+1 a 2 b 3 c 4 d 5 dtype: int64 > obj[obj>10] Series([], dtype: int64)
【DataFrame】
性質:一個表格型的資料結構。它提供有序的列和不同型別的列值。
建立:
將一個{key:list[]}轉換成DataFrame | key為列名 |
DataFrame(data,columns = ['col1','col0']) |
data形式為{key:list[]}的字典 columns引數-指定列的順序 |
DataFrame(data,columns = ['col1','col0','col2']) | 如果columns中傳入的列名找不到,不會報錯,而是產生一列 NA 值 |
獲取資料:frame[‘col1’]、frame.col1
刪除資料:del frame[‘col1’]
from pandas import DataFrame ## 建立DataFrame ## In [0]: DataFrame({'col0':[1,2,3], 'col1':[4,5,6]}) Out[0]: col0 col1 0 1 4 1 2 5 2 3 6 In [1]: data = {'col0':[1,2,3], 'col1':[4,5,6]} DataFrame(data,columns = ['col1','col0']) Out[1]: col1 col0 0 4 1 1 5 2 2 6 3 In [2]: DataFrame(data,columns = ['col1','col0','col2']) Out[2]: col1 col0 col2 0 4 1 NaN 1 5 2 NaN 2 6 3 NaN ## 獲取資料 ## frame = DataFrame({'col0':[1,2,3], 'col1':[4,5,6]}) In [3]: frame['col1'] Out[3]: 0 4 1 5 2 6 Name: col1, dtype: int64 In [4]: frame.col1 Out[4]: 0 4 1 5 2 6 Name: col1, dtype: int64 ## 刪除資料 ## del frame['col1'] In [5]: frame Out[5]: col0 0 1 1 2 2 3
【產生日期】
date_index = pd.date_range('11/19/2017', periods=10, freq='D')
import pandas as pd
date_index = pd.date_range('11/19/2017', periods=10, freq='D')
> date_index
DatetimeIndex(['2017-11-19', '2017-11-20', '2017-11-21', '2017-11-22',
'2017-11-23', '2017-11-24', '2017-11-25', '2017-11-26',
'2017-11-27', '2017-11-28'],
dtype='datetime64[ns]', freq='D')
——————————————————————常用方法———————————————————————
(1) reindex()方法 —— 重新索引
根據index引數重新進行排序。如果傳入的索引值在資料裡不存在,則不會報錯,而是新增缺失值的新行。不想用缺失值,可以用 fill_value 引數指定填充值。
obj1 = obj.reindex([‘a’,’b’,’c’],fill_value = 0) | #fill_value 會讓所有的缺失值都填充為同一個值,如果不想這樣而是用相鄰的元素(左或者右)的值填充,則可以用 method 引數,可選的引數值為 ffill 和 bfill,分別為用前值填充和用後值填充。 |
obj2 = obj.reindex(range(6),method = ‘fill’) |
(2) drop() 方法 —— 丟棄資料
data.drop([‘idx1’,’idx2’]) | #刪除行 |
data.drop([‘col1’,’col2’],axis = 1) | #新增axis引數刪除列 |
(3) 索引、選取和過濾
[注意] 利用索引的切片運算與普通的 Python 切片運算不同,其末端是包含的,既包含最後一個的項。
obj[‘b’:’d’]包含’d’,但是obj[1:3]不包含3
loc和iloc
df.loc[index,column_names] | # 知道column names和index,且兩者都很好輸入 |
df.iloc[index,col_index] | # column_name太長; |
ix操作:混合使用下標和名稱進行選取
data.ix[‘idx’,[‘col1’,’col2’]] | |
data.ix[2] | #第2行 |
data.ix[data.col1<5,:3] | # data.col1<5的前2列 |
(4) 算術運算和資料對齊
- Series:將2個物件相加時,具有重疊索引的索引值會相加處理;不重疊的索引則取並集,值為 NA;
- 對齊操作會同時發生在行和列上,把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) 排序
DataFrame:
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)和外連線[並集](outer) |
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 |
Ref