python pandas常用函式學習
從網上看的一些資料學習一下,有的內容是直接從其他文章中貼上過來的。
pandas 有兩個主要的資料結構:Series 和 DataFrame:
1. Series 是一個一維陣列物件 ,類似於 NumPy 的一維 array。它除了包含一組資料還包含一組索引,所以可以把它理解為一組帶索引的陣列。
將 Python 陣列轉換成 Series 物件:(當沒有顯示指定索引的時候,Series 自動以 0 開始,步長為 1 為資料建立索引。)
將python字典轉換成Series物件:(有指定索引a,b,c,d)
2. dataFrame :一個表格型的資料結構。它提供有序的列和不同型別的列值。
建立:可以將一個{key:list[]}轉換成DataFrame,key為columns
DataFrame(data,columns = [‘col0’,’col1’,’col2’])#傳入columns引數指定列的順序
如果傳入的列名找不到,它不會報錯,而是產生一列 NA 值
檔案讀取
df = pd.read_csv(path='file.csv')
引數:header=None 用預設列名,0,1,2,3...
names=['A', 'B', 'C'...] 自定義列名
index_col='A'|['A', 'B'...] 給索引列指定名稱,如果是多重索引,可以傳list
skiprows=[0,1,2] 需要跳過的行號,從檔案頭0開始,skip_footer從檔案尾開始
nrows=N 需要讀取的行數,前N行
chunksize=M 返回迭代型別TextFileReader,每M條迭代一次,資料佔用較大記憶體時使用
sep=':'資料分隔預設是',',根據檔案選擇合適的分隔符,如果不指定引數,會自動解析
skip_blank_lines=False 預設為True,跳過空行,如果選擇不跳過,會填充NaN
converters={'col1', func} 對選定列使用函式func轉換,通常表示編號的列會使用(避免轉換成int)dfjs = pd.read_json('file.json') 可以傳入json格式字串
dfex = pd.read_excel('file.xls', sheetname=[0,1..]) 讀取多個sheet頁,返回多個df的字典
資料預處理
df.duplicated() 返回各行是否是上一行的重複行
df.drop_duplicates() 刪除重複行,如果需要按照列過濾,引數選填['col1', 'col2',...]
df.fillna(0) 用實數0填充na
df.dropna() axis=0|1 0-index 1-column
how='all'|'any' all-全部是NA才刪 any-只要有NA就全刪
del df['col1'] 直接刪除某一列
df.drop(['col1',...], aixs=1) 刪除指定列,也可以刪除行
df.column = col_lst 重新制定列名
df.rename(index={'row1':'A'}, 重新命名索引名和列名
columns={'col1':'A1'})
df.replace(dict) 替換df值,前後值可以用字典表,{1:‘A', '2':'B'}
def get_digits(str):
m = re.match(r'(\d+(\.\d+)?)', str.decode('utf-8'))
if m is not None:
return float(m.groups()[0])
else:
return 0
df.apply(get_digits) DataFrame.apply,只獲取小數部分,可以選定某一列或行
df['col1'].map(func) Series.map,只對列進行函式轉換
pd.merge(df1, df2, on='col1',
how='inner',sort=True) 合併兩個DataFrame,按照共有的某列做內連線(交集),outter為外連線(並集),結果排序
pd.merge(df1, df2, left_on='col1',
right_on='col2') df1 df2沒有公共列名,所以合併需指定兩邊的參考列
pd.concat([sr1, sr2, sr3,...], axis=0) 多個Series堆疊成多行,結果仍然是一個Series
pd.concat([sr1, sr2, sr3,...], axis=1) 多個Series組合成多行多列,結果是一個DataFrame,索引取並集,沒有交集的位置填入預設值NaN
df1.combine_first(df2) 用df2的資料補充df1的預設值NaN,如果df2有更多行,也一併補上
df.stack() 列旋轉成行,也就是列名變為索引名,原索引變成多層索引,結果是具有多層索引的Series,實際上是把資料集拉長
df.unstack() 將含有多層索引的Series轉換為DataFrame,實際上是把資料集壓扁,如果某一列具有較少類別,那麼把這些類別拉出來作為列
df.pivot() 實際上是unstack的應用,把資料集壓扁
pd.get_dummies(df['col1'], prefix='key') 某列含有有限個值,且這些值一般是字串,例如國家,借鑑點陣圖的思想,可以把k個國家這一列量化成k列,每列用0、1表示
資料篩選
df.columns 列名,返回Index型別的列的集合
df.index 索引名,返回Index型別的索引的集合
df.shape 返回tuple,行x列
df.head(n=N) 返回前N條
df.tail(n=M) 返回後M條
df.values 值的二維陣列,以numpy.ndarray物件返回
df.index DataFrame的索引,索引不可以直接賦值修改
df.reindex(index=['row1', 'row2',...]
columns=['col1', 'col2',...]) 根據新索引重新排序
df[m:n] 切片,選取m~n-1行
df[df['col1'] > 1] 選取滿足條件的行
df.query('col1 > 1') 選取滿足條件的行
df.query('col1==[v1,v2,...]')
df.ix[:,'col1'] 選取某一列
df.ix['row1', 'col2'] 選取某一元素
df.ix[:,:'col2'] 切片選取某一列之前(包括col2)的所有列
df.loc[m:n] 獲取從m~n行(推薦)
df.iloc[m:n] 獲取從m~n-1行
df.loc[m:n-1,'col1':'coln'] 獲取從m~n行的col1~coln列
sr=df['col'] 取某一列,返回Series
sr.values Series的值,以numpy.ndarray物件返回
sr.index Series的索引,以index物件返回
資料運算與排序
df.T DataFrame轉置
df1 + df2 按照索引和列相加,得到並集,NaN填充
df1.add(df2, fill_value=0) 用其他值填充
df1.add/sub//mul/div 四則運算的方法
df - sr DataFrame的所有行同時減去Series
df * N 所有元素乘以N
df.add(sr, axis=0) DataFrame的所有列同時減去Series
sr.order() Series升序排列
df.sort_index(aixs=0, ascending=True) 按行索引升序
df.sort_index(by=['col1', 'col2'...]) 按指定列優先排序
df.rank() 計算排名rank值
數學統計
sr.unique Series去重
sr.value_counts() Series統計頻率,並從大到小排序,DataFrame沒有這個方法
sr.describe() 返回基本統計量和分位數df.describe() 按各列返回基本統計量和分位數
df.count() 求非NA值得數量
df.max() 求最大值
df.min() 求最大值
df.sum(axis=0) 按各列求和
df.mean() 按各列求平均值
df.median() 求中位數
df.var() 求方差
df.std() 求標準差
df.mad() 根據平均值計算平均絕對利差
df.cumsum() 求累計和
sr1.corr(sr2) 求相關係數
df.cov() 求協方差矩陣
df1.corrwith(df2) 求相關係數pd.cut(array1, bins) 求一維資料的區間分佈
pd.qcut(array1, 4) 按指定分位數進行區間劃分,4可以替換成自定義的分位數列表df['col1'].groupby(df['col2']) 列1按照列2分組,即列2作為key
df.groupby('col1') DataFrame按照列1分組
grouped.aggreagte(func) 分組後根據傳入函式來聚合
grouped.aggregate([f1, f2,...]) 根據多個函式聚合,表現成多列,函式名為列名
grouped.aggregate([('f1_name', f1), ('f2_name', f2)]) 重新命名聚合後的列名
grouped.aggregate({'col1':f1, 'col2':f2,...}) 對不同的列應用不同函式的聚合,函式也可以是多個
df.pivot_table(['col1', 'col2'],
rows=['row1', 'row2'],
aggfunc=[np.mean, np.sum]
fill_value=0,
margins=True) 根據row1, row2對col1, col2做分組聚合,聚合方法可以指定多種,並用指定值替換預設值
pd.crosstab(df['col1'], df['col2']) 交叉表,計算分組的頻率