Pandas數(shù)據(jù)結(jié)構(gòu)介紹
Series
聲明對(duì)象
Series是帶索引功能的一維數(shù)組澜躺,其對(duì)象包含value和index基本屬性
s=pd.Series([1,2,3],index=['a','b','c'])
s.index #['a','b','c']
s.value #[1,2,3]取元素
s[索引] # s[['b','c']]用Numpy數(shù)組或其他Series對(duì)象定義新的Series對(duì)象
a=np.arrat([1,2,3])
s1=pd.Series(a)
s2=pd.Series(s)
這樣生成的新對(duì)象并不是副本而是原對(duì)象的引用篩選元素
因?yàn)閜andas是以Numpy為基礎(chǔ)的讯蒲,所以可以直接用Numpy中的一些辦法
s[s>5]運(yùn)算
運(yùn)算的原理也與numpy相通
np.log(s)Series對(duì)象的組成元素
unique()函數(shù)用來取出對(duì)象中不重復(fù)出現(xiàn)的元素
vlaues_count()函數(shù)用來統(tǒng)計(jì)每個(gè)值的個(gè)數(shù)
isin([值])返回是否在其中来庭,布爾型NaN處理
s[s.isnull()]輸出空值
s[s.notnull()]輸出非空值Series與字典
mydict={'red':1,'green':2,'yellow':3}
s5=pd.Series(mydict)
字典的索引自動(dòng)變?yōu)镾eries的索引Series對(duì)象之間的運(yùn)算
s1+s2只會(huì)進(jìn)行索引值相同部分的相加生成新的Series對(duì)象,兩者獨(dú)有的索引值會(huì)也會(huì)存在陕壹,運(yùn)算后對(duì)應(yīng)的值為NaN
DataFrame
DataFrame對(duì)象就是一張強(qiáng)行帶上索引列的二維表,出去index的那一列其余的列名保存在column屬性中。
定義對(duì)象
- 傳入字典
dict={'color':['red','green','yellow'],'name':['ball','pen','pencil'],'price':[1,1,2,1,2]}
frame=pd.DataFrame(dict)
這樣index列會(huì)默認(rèn)設(shè)置為0,1,2,3.凡伊。。
frame=pd.DataFrame(dict,index=['','',''])等 - DataFrame(數(shù)據(jù)窒舟,index,column)
frame=pd.DataFram(np.random.random(16).reshape((4,4)),index=[],columns=[])
選取元素
按列選认得Α:frame['color']與fram.color的效果是一樣的,返回的是Series對(duì)象
按行選然莶颉:frame.ix[行的索引值] frame.ix[2]
也可以:
frame[0:1]選取第0行
frame[1:3]選取第1银还,2行
最后,如果獲取存儲(chǔ)在DataFrame中的一個(gè)元素洁墙,需要依次指定元素所在的列的名稱蛹疯、行的索引值或標(biāo)簽 frame['name'][3]
賦值
按照取值的邏輯自然就可以賦值、增加的新的行和列
fram['new']=[...] 插入某列
fram['new'][0]=
fram['new']=Series
疑問热监?DataFrame插入某行怎么辦捺弦?
元素所屬關(guān)系
frame[frame.isin([1.0,'pen'])]
轉(zhuǎn)置
DataFrame的轉(zhuǎn)置很簡(jiǎn)單直接 Fram.T即可實(shí)現(xiàn)
刪除一列
del fram['new']
篩選
frame[frame<12] 符合條件的會(huì)被留下且位置不變。不符合條件的變成NaN
嵌套字典生成DataFrame
mydict={'red':['l1':1,'l2':2,'l3':3],'yellow':['l1':4孝扛,'l2':5,'l3':6],'green':['l1':7,'l2':8,'l3':9]}
第一層嵌套是列列吼,里面重復(fù)嵌套行。
刪除某行某列
frame.drop([index1,index2...]) 刪除行
frame.drip([column1,column2....],axis=1) 刪除列
數(shù)據(jù)結(jié)構(gòu)之間的運(yùn)算
就是Series和DataFrame之間的運(yùn)算
除了用運(yùn)算符苦始,以下函數(shù)也是可以的
- add()
- sub()
- div()
- mul()
比如 frame1+frame2與 frame1.add(frame2)的效果是一樣的
Series和DataFrame之間的運(yùn)算就有些復(fù)雜了寞钥,簡(jiǎn)而言之,兩者運(yùn)算靠共同的索引陌选,不同的索引會(huì)造成打量的NaN
可以看到Frame中的列索引與Ser想同的部分都做了相減理郑。如果索引值沒有想同的就會(huì)
產(chǎn)生NaN
函數(shù)與映射
按行或列執(zhí)行操作的函數(shù)
f=lambda x: x.max()-x.min()
frame.apply(f)按列執(zhí)行
frame.apply(f,axis=1) 按行執(zhí)行
統(tǒng)計(jì)函數(shù)
frame.sum() fram.mean() 等依然可以按照列進(jìn)行相關(guān)統(tǒng)計(jì)量的計(jì)算
frame.describe() 將會(huì)列出所有描述性統(tǒng)計(jì)量
排序
sort_index() 可以對(duì)Series和DataFrame的索引進(jìn)行排序
sort_index(axis=1) 可以對(duì)DataFrame的橫軸進(jìn)行排序
值排序
ser.order() 默認(rèn)升序 改變:ser.order(ascending=False)
對(duì)frame 需要制定按照哪一列:
frame.sort_index(by='price')
NaN的處理
過濾NaN
- ser.dropna() 但fram.dropna()會(huì)刪除NaN存在的整個(gè)行和列
fram.dropna(how='all')刪除行或列整個(gè)都是NaN的情況 - 也可以索引過濾: ser[ser.notnull()]
為NaN填充其他值
- fram.fillna(值)
- 不同的列填充不同:fram.fillna({'price':1,'color':null,'name':null})
最后說一下蹄溉,Series是可以層級(jí)的形式出現(xiàn)的。Series和DataFrame之間可以用stack(), unstack()函數(shù)互相轉(zhuǎn)換