Pandas的數(shù)據(jù)結(jié)構(gòu)
pandas 中使用Series和DataFrame對象存儲數(shù)據(jù)
Series
1.什么是Series
????????Series是一種類似與一維數(shù)組的對象,由下面兩個部分組成:
????????????????values:一組數(shù)據(jù)(ndarray類型)
????????????????index:相關(guān)的數(shù)據(jù)索引標(biāo)簽
2.如何創(chuàng)建Series
(1) 由列表或numpy數(shù)組創(chuàng)建
默認(rèn)索引為0到N-1的整數(shù)型索引
可以通過設(shè)置index參數(shù)指定索引

特別地,由ndarray創(chuàng)建的是引用,而不是副本。對Series元素的改變也會改變原來的ndarray對象中的元素。(列表沒有這種情況)
(2) 由字典創(chuàng)建

3.Series的索引和切片
可以使用中括號取單個索引(此時返回的是元素類型),或者中括號里一個列表取多個索引(此時返回的仍然是一個Series類型)。分為顯示索引和隱式索引:
(1) 顯式索引:
????????????使用index中的元素作為索引值
????????????使用.loc[](推薦)
????????????注意:?此時是閉區(qū)間

(2) 隱式索引:
????????????使用整數(shù)作為索引值
????????????使用.iloc[](推薦)
? ??????????注意:?此時是半開區(qū)間
4.Series的基本屬性
可以把Series看成一個定長的有序字典
可以通過shape,size,index,values等得到series的屬性

可以通過head(),tail()快速查看Series對象的樣式

當(dāng)索引沒有對應(yīng)的值時,可能出現(xiàn)缺失數(shù)據(jù)顯示NaN(not a number)的情況

可以使用pd.isnull(),pd.notnull(),或自帶isnull(),notnull()函數(shù)檢測缺失數(shù)據(jù)
5.Series的運(yùn)算
(1) 適用于numpy的數(shù)組運(yùn)算也適用于Series
(2) Series之間的運(yùn)算
在運(yùn)算中自動對齊不同索引的數(shù)據(jù)
如果索引不對應(yīng),則補(bǔ)NaN

注意:要想保留所有的index,則需要使用.add()函數(shù)
DataFrame
1.什么是DataFrame
DataFrame是一個【表格型】的數(shù)據(jù)結(jié)構(gòu),可以看做是【由Series組成的字典】(共用同一個索引)。DataFrame由按一定順序排列的多列數(shù)據(jù)組成。設(shè)計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。
????????????行索引:index
????????????列索引:columns
????????????值:values(numpy的二維數(shù)組)
2.如何創(chuàng)建DataFrame
最常用的方法是傳遞一個字典來創(chuàng)建。DataFrame以字典的鍵作為每一【列】的名稱,以字典的值(一個數(shù)組)作為每一列。
此外,DataFrame會自動加上每一行的索引(和Series一樣)。
同Series一樣,若傳入的列與字典的鍵不匹配,則相應(yīng)的值為NaN。


DataFrame屬性:values、columns、index、shape

3.DataFrame的索引
(1) 對列進(jìn)行索引
????????????通過類似字典的方式
????????????通過屬性的方式
可以將DataFrame的列獲取為一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經(jīng)設(shè)置好了,就是相應(yīng)的列名。


(2) 對行進(jìn)行索引
????????????使用.ix[]來進(jìn)行行索引
????????????使用.loc[]加index來進(jìn)行行索引
????????????使用.iloc[]加整數(shù)來進(jìn)行行索引
同樣返回一個Series,index為原來的columns

(3) 對元素索引的方法
????????????使用列索引
????????????使用行索引(iloc[3,1]相當(dāng)于兩個參數(shù);iloc[[3,3]] 里面的[3,3]看做一個參數(shù))
????????????使用values屬性(二維numpy數(shù)組)

注意: 直接用中括號時
????????????索引表示的是列索引
????????????切片表示的是行切片
4.DataFrame的運(yùn)算
在運(yùn)算中自動對齊不同索引的數(shù)據(jù)
如果索引不對應(yīng),則補(bǔ)NaN


(2) Series與DataFrame之間的運(yùn)算
【重要】
使用Python操作符:以行為單位操作(參數(shù)必須是行),對所有行都有效。(類似于numpy中二維數(shù)組與一維數(shù)組的運(yùn)算,但可能出現(xiàn)NaN)
使用pandas操作函數(shù):
? ????????????axis=0:以列為單位操作(參數(shù)必須是列),對所有列都有效。
? ????????????axis=1:以行為單位操作(參數(shù)必須是行),對所有行都有效。
處理丟失數(shù)據(jù)
None
None是Python自帶的,其類型為python object。因此,None不能參與到任何計算中。
object類型的運(yùn)算要比int類型的運(yùn)算慢得多

np.nan(NaN)
np.nan是浮點類型,能參與到計算中。但計算的結(jié)果總是NaN。
但可以使用np.nan*()函數(shù)來計算nan,此時視nan為0。
pandas中的None與NaN
1) pandas中None與np.nan都視作np.nan

2) pandas中None與np.nan的操作
判斷函數(shù)
????????isnull()
????????notnull()

過濾函數(shù)
????????dropna(): 過濾丟失數(shù)據(jù)
????????fillna(): 填充丟失數(shù)據(jù)



層次化索引
1. 創(chuàng)建多層行索引
????1) 隱式構(gòu)造
????????????最常見的方法是給DataFrame構(gòu)造函數(shù)的index參數(shù)傳遞兩個或更多的數(shù)組
????????????Series也可以創(chuàng)建多層索引

? ? 2) 顯示構(gòu)造pd.MultiIndex

使用數(shù)組

使用元組

使用product(最簡單,推薦使用)

2.多層列索引同上
3.多層索引對象的索引與切片操作
? ??????1)Series的操作
? ? ? ? ? ? ?重要:對于Series來說,直接中括號[]與使用.loc()完全一樣,因此,推薦使用中括號索引和切片。

2)DataFrame操作
? ? ? ? ? ? (1) 可以直接使用列名稱來進(jìn)行列索引
????????????(2) 使用行索引需要用ix(),loc()等函數(shù)
極其重要:推薦使用loc()函數(shù)
注意在對行索引的時候,若一級行索引還有多個,對二級行索引會遇到問題!也就是說,無法直接對二級索引進(jìn)行索引,必須讓二級索引變成一級索引后才能對其進(jìn)行索引!

4.索引的堆(stack)
unstack()

stack()

小技巧:使用stack()的時候,level等于哪一個,哪一個就消失,出現(xiàn)在行里。
小技巧:使用unstack()的時候,level等于哪一個,哪一個就消失,出現(xiàn)在列里
5.聚合操作
平均數(shù),方差,最大值,最小值……

pandas的拼接操作
pandas的拼接分為兩種:
????????級聯(lián):pd.concat, pd.append
????????合并:pd.merge, pd.join
pd.concat()
1).簡單級聯(lián)
pandas使用pd.concat函數(shù),與np.concatenate函數(shù)類似,只是多了一些參數(shù):
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False,copy=True)
和np.concatenate一樣,優(yōu)先增加行數(shù)(默認(rèn)axis=0),可以通過設(shè)置axis來改變級聯(lián)方向
注意 index在級聯(lián)時可以重復(fù)? ?也可以選擇忽略ignore_index,重新索引
或者使用多層索引 keys? ?concat([x,y],keys=['x','y'])
2).不匹配級聯(lián)
不匹配指的是級聯(lián)的維度的索引不一致。例如縱向級聯(lián)時列索引不一致,橫向級聯(lián)時行索引不一致
有3種連接方式:
????????????外連接:補(bǔ)NaN(默認(rèn)模式)
????????????內(nèi)連接:只連接匹配的項
????????????連接指定軸 join_axes
3) 使用append()函數(shù)添加
????????級聯(lián)的使用非常普遍,因此有一個函數(shù)append專門用于在后面添加
pd.merge()
merge與concat的區(qū)別在于,merge需要依據(jù)某一共同的行或列來進(jìn)行合并
使用pd.merge()合并時,會自動根據(jù)兩者相同column名稱的那一列,作為key來進(jìn)行合并。
注意每一列元素的順序不要求一致
? ??????1) 一對一合并
????????2) 多對一合并
????????3) 多對多合并
????????4) key的規(guī)范化
? ??????????????使用on=顯式指定哪一列為key,當(dāng)有多個key相同時使用
????????????????使用left_on和right_on指定左右兩邊的列作為key,當(dāng)左右兩邊的key都不想等時使用
????????5) 內(nèi)合并與外合并
????????????????內(nèi)合并:只保留兩者都有的key(默認(rèn)模式)
????????????????外合并 how='outer':補(bǔ)NaN
????????????????左合并、右合并:how='left',how='right'
????????6) 列沖突的解決
? ? ? ? ? ? ? ? 當(dāng)列沖突時,即有多個列名稱相同時,需要使用on=來指定哪一個列作為key,配合suffixes指定沖突列名,可以使用suffixes=自己指定后綴