pandas數據分析進階筆記(三):pandas

(一)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)散點圖

(六)數據聚合與分組運算

image.png

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。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容