(一)pandas基礎
常用的兩種數據結構:Series,DataFrame.
鑒于Series可根據index取得values,可通過字典來創建Series。
isnull和notnull用于檢測確實數據。
布爾型索引,層次化索引(重新分級排序),重新索引(reindex(),參數:index, method, fill_value, limit, level, copy)
drop(),丟棄指定軸上的項,即丟棄行或列,有個axis參數制定行(axis=0)還是列(axis=1).
利用ix對指定的行,列標簽進行索引,如data.ix(行標簽,列標簽),非常好用的索引方法。
sort-index(),接受一個axis參數,對行或列標簽進行排序,若要對列的值進行排序,可使用by參數。
data.describe() 用于一次產生多個匯總統計。
value_counts() 返回一個Series,其索引為唯一值,按發現的順序返回。
unique計算Series中的唯一值數組,按發現的順序返回。
缺失數據處理方法:
dropna() 根據各標簽的值中是否存在缺失數據對軸標簽進行過濾,可通過調節閥值調整對缺失值的容忍度。
fillna() 填充缺失數據,參數:value,method,axis,inplace,limit。
(二)pandas數據讀取
pd.read_csv() 加載帶分隔符的數據,默認分隔符為逗號
pd.read_table() 也是加載帶分隔符的數據,默認分隔符為制表符("\t")
read_fwf() 讀取定寬列格式數據(也即無分隔符)
數據保存。
json.loads() 將Json字符串轉換為python格式
json.dumps() 將python對象轉換為Json格式
Pytables和h5py 高速讀寫,適用于大量數據,密集IO型
pd.read_csv()/pd.read_table()的參數:
path 文件路徑及文件名
sep或delimiter 分隔符,支持正則
header 用作列名的行號,默認第一行,無則設置為None
index_col 用作行索引的列名或列編號
names header=None時自行設置的列名
skiprows 忽略行數,從頭算起
skip_footer 忽略行數,從文件尾算起
nrows 讀取的行數
iterator 返回一個TextParser以便逐塊讀取
chunksize 文件塊的大小(用于迭代)
(三)數據規整化:清理,轉換,合并,重塑
pd.merge()參數:
left,right 參與合并的左右的DataFrame
how inner,outer,left,right之一,默認為inner,即取交集,outer取并集
on 用于連接的列名。默認以兩個DataFrame的交集作為連接鍵
left_on,right_on 左右DataFrame中用作連接鍵的列
left_index,right_index 將左/右側行索引作為連接鍵
sort 根據連接鍵對合并后的數據進行排序,默認為True。處理大數據時禁用以獲得更好的性能
suffixes 字符串元組,用于追加到重疊列名的末尾,默認為('_x','_y').
copy 設置為False可以在某些特殊情況下避免將數據復制到結果數據結構中,默認為True
join方法能更為方便地實現按索引合并。
軸向連接,pd.concat(),參數:
objs 參與連接的pandas對象的列表或字典,唯一必需的參數,如[df1,df2]
axis 連接的軸向,默認為o(行)
join inner,outer之一,指明合并方式:交集還是并集
join_axes 指明用于其他n-1條軸的索引,不執行交/并集運算
keys 與連接對象有關的值,用于形成連接軸向上的層次化索引
levels 指定用作層次化索引個級別上的索引,若設置了keys的話
names 設置分層索引的名稱,前提時設置了keys或者values
verify_integrity 檢查結果對象新軸上的重復情況,若有則異常,默認False允許重復
ignore_index 不保留連接軸上的索引,產生一組新的索引
利用合并來實現根據另一個dataframe來對一個dataframe進行篩選:
In [27]: df1 = pd.DataFrame({'a':list(range(3)),'b':list(range(1,4)),'c':['aa','bb','cc']})
In [42]: df2 = pd.DataFrame({'a':list(range(1,4)),'b':list(range(2,5))})
In [36]: # df2.columns = list(df1.columns)[:len(df2.columns)] # 這是為了使合并時相同內容的列列名相同
In [45]: pd.concat([df1,df2,df2]).drop_duplicates(subset=('a','b'),keep=False)
Out[45]: # 刪除了a,b列中df1與df2值相同的行
a b c
0 0 1 aa
combine_first(),為含有重疊索引的機組數據互相打補丁,也即互補填充NaN值。
重塑層次化索引.
stack 將數據的列'旋轉'為行
unstack 將數據的行'旋轉'為列
pivot()可達到類似的效果。
移除重復數據
duplicated() 返回一個布爾型Series判斷每一行是否重復
drop_duplicates( ) 移除重復行,也可移除指定重復列,可考慮先排序再消去重復
map()可用來添加或轉換某列或與某列有對應關系的列
replace()直接對DataFrame中的特定值進行替換
rename()轉換軸標簽,不改變原數據,若inplace=True,則改變原數據
cut()劃分樣本所屬區間,將其分為幾類
qcut()將樣本劃分為幾個區間,每個區間內樣本數相等
get_dummies() 可用于機器學習的數據處理,將各個特征分類變成0,1
(四)matplotlib API入門
(1)創建Figure,fig=plt.figure()
。plt.gcf()可得到當前Figure的引用。
(2)在Figure中繪圖時先加入一個活多個subplot才行。ax1=fig.add_subplot(2,2,1)
(3)在ax1中繪圖,plt.plot(np.random.randn(50).cumsum(), 'k--')
(4)設置坐標軸范圍,ax1=set_xlim(a,b), ax1.set_ylim(m,n)
(5)設置坐標軸刻度,ax1.set_xticks(....), ax1.set_yticks(....)
。也可設置其他值(如字符串)作為刻度,如
ax1.set_xtickslables(*strings)
(6)設置x,y軸名稱,ax1.set_xlable('x'); ax1.set_ylable('y')
(7)設置圖片標題,ax1.set_title('hello world')
(8)設置圖例,一般在繪圖時加入,如plt.plot(np.random.randn(50.cumsum()), 'k--', lable='apple')
,后面的lable參數即為圖例。最后調用ax1.legend(loc="best")或plt.legend(loc="best")
來顯示圖例。
(9)添加注釋(如文本、箭頭等)。添加文本ax1.text(x,y,'hello',fontsize=10)
,(x,y)為添加文本的位置,"hello"為添加文本的內容。
(10)保存。plt.savefig("figpath.png")
,參數:
fname 含文件路徑的字符串或python的文件型對象,圖片格式有文件擴展名推斷出,如png,pdf等
dpi 圖片分辨率,默認為100
facecolor,edgecolor 圖像背景色,默認白色
farmat 直接設置圖片格式,如JPG,pdf等
bbox_inches 圖像需保存的部分,若設置為"tight",則盡可能剪除圖像周圍空白部分。
(五)pandas中的繪圖函數回執的matplotlib
Series.plot()方法,也可在DataFrame中使用,參數:
label 用于圖例的標簽
ax 要在其上進行繪制的matplotlib subplot對象,若未設置,則使用當前matplotlib subplot
style 傳給matplotlib的畫圖風格字符串,如"ko--"
alpha 圖像的填充不透明度(0-1)
kind 圖的類型,可以是"line","bar","barh"(水平柱狀圖),"kde"(密度圖)
logy 在y軸上使用對數標尺
use_index 將對象的索引用作刻度標簽
rot 旋轉刻度標簽
xticks,yticks 用作x/y刻度的值
xlim, ylim x/y軸的界限
grid 顯示軸網格線,默認打開
專用于DataFrame的plot參數:
subplots 將各個DataFrame列繪制到單獨的subplot中
sharex,sharey 若subplots為True,則共用一個x/y軸
figsize 表示圖像大小的元組
title 圖像標題
legend 添加一個subplot圖例,默認為True
sort_columns 以字母表順序繪制各列,默認使用當前列順序
(1)柱狀圖 kind='bar'或kind='barh'(水平柱狀圖)。設置stacked=True可生成堆疊狀柱狀圖(各行堆在一起)。
歸一化。
(2)直方圖與密度圖
(3)散點圖
(六)數據聚合與分組運算
GroupBy技術 split-apply-combine 拆分-應用-合并
一般用法:df.groupby('key1')['data1'] <==> df['data1'].groupby(df['key1'])
有時候根據層次化索引分組是個不錯的選擇,傳入level參數,如df.groupby(level='city', axis=1).count()
groupby()可根據行列標簽以及函數來進行分組。
經過優化的groupby方法:
count 分組中非NA值的數量
sum 非NA值的和
mean ...平均值
median ...中位數
std,var 無偏(分母為n-1)標準差和方差
min,max ...最大值和最小值
prod 非NA值的積
first,last 第一個,最后一個非NA值
#栗子
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.arange(12).reshape((3,4)), columns=['chr','pos','a','b']
df = pd.concat([df1,df1])
#df
chr pos a b
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df.groupby(['chr','pos']).sum()
a b
chr pos
0 1 2 3
4 5 6 7
8 9 10 11
groupby對象也可通過agg()方法對特定列使用自定義統計方法。
transform(向量化運算),將一個函數應用到各個分組,然后將結果放置到適當的位置上。
跟agg一樣,transform也是一個有著嚴格條件的特殊函數:傳入的函數只能產生兩種結果,要么產生一個可以廣播的標量值(如np.mean),要么產生一個相同大小的結果數組。
apply,最一般的groupby方法。apply會將待處理的對象拆分成多個片段,然后對各個片段調用傳入的函數,最后嘗試將各個片段組合到一起。例子:
import pandas as pd
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'], 'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.random.randn(5), 'data2': np.random.randn(5)})
def f(df, col=1):
return df[df['data2'] == max(df['data2'])]
df1 = df.groupby(['key1']).apply(f) #使用key1作為分組元素進行分組并使用data2篩選數據,留下每個組中data2最大的
print(df)
print(df1)
#輸出
data1 data2 key1 key2
0 -0.407953 -0.506048 a one
1 -1.282764 0.575502 a two
2 0.697294 1.183693 b one
3 -1.699044 0.090585 b two
4 1.144997 0.224858 a one
data1 data2 key1 key2
key1
a 1 -1.282764 0.575502 a two
b 2 0.697294 1.183693 b one
[Finished in 2.7s]
透視表,pivot_table方法,參數:
values 待聚合的列的名稱,默認聚合所有數值列
rows 用于分組的列名或其他分組鍵,出現在結果透視表的行
cols 用于分組的列名或其他分組鍵,出現在結果透視表的列
aggfunc 聚合函數或函數列表,默認為mean,可以是任何對groupby對象有效的函數
fill_value 用于替換結果表中的缺失值
margins 添加行/列小計的總計,默認為False
交叉表,crosstab。