一.pandas數(shù)據(jù)處理簡(jiǎn)介
1.簡(jiǎn)介
pandas:是基于:實(shí)現(xiàn)的python的一個(gè)數(shù)據(jù)分析包。名字來(lái)源:面板數(shù)據(jù)(panel data)和python數(shù)據(jù)分析(data analysis)
注意:
DataFrame是一個(gè)二維表格。0軸:跨行(down)玩徊, 1軸:跨列(across)
- 使用0值:表示沿著每一列或者行標(biāo)簽(行索引值)癌椿,向下執(zhí)行方法
- 使用1值:表示沿著每一行或者列標(biāo)簽(列索引值),橫向執(zhí)行對(duì)應(yīng)的方法
2.數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介
- Series:一維數(shù)組件缸,與Numpy中一維array類似。二者與python基本的數(shù)據(jù)結(jié)構(gòu)list也很接近。
- Time-Series:以時(shí)間為索引的Series
- DataFrame:二維的表格形數(shù)據(jù)結(jié)構(gòu)休涤。可以理解為:Series的容器
-
Panel:三維數(shù)組,可以理解為DataFrame的容器
1.series構(gòu)造函數(shù):
2.series屬性和方法:
3.DataFrame構(gòu)造函數(shù)
4.DataFrame屬性和方法
5.pandas描述性統(tǒng)計(jì)
6.pandas函數(shù)應(yīng)用
7.迭代
7.1 對(duì)象直接進(jìn)行迭代
7.2 其他迭代
itertuples()方法將DataFrame中的每一行返回一個(gè)產(chǎn)生一個(gè)命名元組的迭代器功氨。元組的第一個(gè)元素:是行的相應(yīng)的索引值序苏。而剩余的值是行值。
二.pandas實(shí)例
1.數(shù)據(jù)選擇和賦值
1.排序
- 按軸排序:df.sort_index(axis=1, ascending=False)捷凄,表示:按照列索引值(axis=1)忱详,進(jìn)行降序排列
- 按值排序:df.sort_values(by='B')
2.選擇數(shù)據(jù)
1)獲取 - 選擇一列,產(chǎn)生一個(gè)‘Series’:df['A'] or df.A
- 對(duì)行進(jìn)行切片:df[0:3]
2)按標(biāo)簽選擇(loc) - 通過(guò)標(biāo)簽獲取一行數(shù)據(jù):df.loc[dates[0]]
- 通過(guò)標(biāo)簽在多個(gè)軸上選擇數(shù)據(jù):df.loc[:, ['A', 'B']]
- 通過(guò)標(biāo)簽同時(shí)在兩個(gè)軸上切片:df.loc['20130102:20130104', ['A', 'B']]
3)按位置選擇(iloc) - 通過(guò)傳遞整數(shù)的位置選擇:df.iloc[3]
- 通過(guò)整數(shù)切片:df.iloc[3:5, 0:2]. PS:最后一個(gè)不包括(左閉右開)
- 通過(guò)傳遞整數(shù)列表按位置切片:df.iloc[[1,2,4], [0,2]]
- 整行切片:df.iloc[1:3]
- 整列切片:df.iloc[:, 1:3]
- 獲取某個(gè)具體值:df.iloc[1, 1]
- 快速訪問(wèn)標(biāo)量:df.iat[1, 1]
4)布爾索引 - 使用單個(gè)列的值來(lái)選擇數(shù)據(jù):df[df.A > 0], 所有:df[]行索引跺涤, 行條件:df.A > 0
- 從滿足布爾條件的DataFrame中選擇值:df[df > 0], 備注: < 0的值都變成了nan
- 使用isin()過(guò)濾:df[df['E'].isin(['two', 'four'])]
5)賦值(at和iat) - 添加新列將自動(dòng)根據(jù)索引對(duì)其數(shù)據(jù):df['F'] = 1
- 通過(guò)標(biāo)簽賦值:df.at[datas[0], 'A'] = 0
- 通過(guò)位置賦值:df.iat[0, 1] = 0
- 使用Numpy數(shù)組賦值:df.loc[:, 'D'] = np.array([5]*len(df))
- 帶where條件的賦值操作:df2[df2 > 0] = -df2
三.pandas數(shù)據(jù)處理
1.GroupBy:分組合并
1)過(guò)程和原理
GroupBy操作由三個(gè)階段組成:
- 分組:將數(shù)據(jù)分成多個(gè)組匈睁。分組標(biāo)準(zhǔn):通常與索引或某一列具體元素有關(guān)
- 用函數(shù)處理:用函數(shù)處理每一個(gè)分組,為每組數(shù)組生成一個(gè)單一的值
- 合并:把來(lái)自每一組的結(jié)果匯集到一起桶错,合并成一個(gè)新對(duì)象
2)實(shí)例:用列元素航唆,作為鍵進(jìn)行分組 - group=df['price1'].groupby(df['color']), 得到的對(duì)象:GroupBy對(duì)象
也可以寫成:group=df.groupby(df['color']).price1 or group = df.groupby(df['color'])['price1']
應(yīng)該是:groupby的計(jì)算優(yōu)先等級(jí)比較高 - group.groups:查看分組情況
- group.mean():對(duì)每個(gè)分組應(yīng)用mean函數(shù)
- group.sum():對(duì)每個(gè)分組應(yīng)用sum函數(shù)
3)等級(jí)分組:可以使用多列,多個(gè)鍵進(jìn)行等級(jí)分組 - group = df['price1'].groupby([df['color'], df['object']])院刁, 先按照color進(jìn)行分組佛点,然后再對(duì)每一組按照object進(jìn)行分組
- group.sum():最小分組,進(jìn)行求和
2.merge():合并
把兩個(gè)DF按照一定方式合并成一個(gè)DF
3.concat:拼接
1)concatenate()函數(shù)
numpy的concatenate()函數(shù)就是用于數(shù)組的拼接擦歐總
2)concat()函數(shù)
pandas庫(kù)以及它的Series和DataFrame等數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)了帶編號(hào)的索引黎比,Pandas的concat()函數(shù)實(shí)現(xiàn)了按索引拼接的功能
例子:
#默認(rèn)axis=0
ser1 = pd.Series(np.random.rand(4), index=[1,2,3,4])超营,
ser2 = pd.Series(np.random.rand(4), index=[5,6,7,8])
print(pd.concat([ser1, ser2]))
#按照axis=1
ser1 = pd.Series(np.random.rand(4), index=[1,2,3,4])
ser2 = pd.Series(np.random.rand(4), index=[5,6,7,8])
print(pd.concat([ser1, ser2], axis=1))
#內(nèi)連接操作
ser1 = pd.Series(np.random.rand(4), index=[1,2,3,4])
ser2 = pd.Series(np.random.rand(4), index=[5,6,7,8])
df = pd.concat([ser1, ser2], axis=1)
print(df)
print('--------')
print(pd.concat([ser1, df], axis=1, join='inner'))
concat():默認(rèn)按照axis=0這條軸進(jìn)行拼接數(shù)據(jù),并返回Series對(duì)象阅虫。如果指定axis=1演闭, 返回的結(jié)果是DataFrame對(duì)象
concat():默認(rèn)是外連結(jié)操作,把join選項(xiàng)設(shè)置為inner颓帝,可以執(zhí)行內(nèi)連接操作米碰。
3)等級(jí)索引
假如我們想用于拼接的軸上創(chuàng)建等級(jí)索引,可以借助keys選項(xiàng)來(lái)完成购城,如下所示:
#axis=0方向吕座,建立額外索引
import pandas as pd
import numpy as np
ser1 = pd.Series(np.random.rand(4), index=[1,2,3,4])
ser2 = pd.Series(np.random.rand(4), index=[5,6,7,8])
print(pd.concat([ser1, ser2], keys=[1,2]))
#axis=1方向,建立索引
ser1 = pd.Series(np.random.rand(4), index=[1,2,3,4])
ser2 = pd.Series(np.random.rand(4), index=[5,6,7,8])
print(pd.concat([ser1, ser2], axis=1,keys=[1,2]))
4)DataFrame對(duì)象的拼接
- pd.concat([frame1, frame2])
- pd.concat([frame1, frame2], axis=1)
4.刪除數(shù)據(jù):
- drop():返回不包含已刪除索引及其元素的新對(duì)象
- del:刪除數(shù)據(jù)列
- drop_duplicateds():從DataFrame對(duì)象中刪除所有重復(fù)的行瘪板,返回刪除重復(fù)行后的DataFrame對(duì)象
1)刪除Series對(duì)象數(shù)據(jù)
- drop:ser.drop('yelow') or ser.drop(['blue', 'white'])
2)刪除DataFrame對(duì)象數(shù)據(jù) - 刪除行:frame.drop(['blue', 'yellow'])
- 刪除列:frame.drop(['pen', 'pencil'], axis=1)吴趴。axis=1,表示跨列的方向侮攀,也就是橫向的方向锣枝。找pen和pencil索引并刪除
- del:刪除列的另一種方式 del frame['ball']
- 刪除重復(fù)行:
duplicated():函數(shù)可以用力啊檢測(cè)重復(fù)的行,返回元素為bool的Series對(duì)象兰英,每個(gè)元素對(duì)應(yīng)一行撇叁。如果該行與前面行重復(fù),則為True
drop_duplicated():實(shí)現(xiàn)了刪除功能畦贸,該函數(shù)返回刪除重復(fù)行后的DataFrame對(duì)象
5.旋轉(zhuǎn)數(shù)據(jù)
通常陨闹,按行或列調(diào)整元素并不總能滿足目標(biāo),有時(shí),需要按照行重新調(diào)整列或者按照列重新調(diào)整行的元素
1)DataFrame的轉(zhuǎn)置
- df.T
2)按等級(jí)索引旋轉(zhuǎn)
前面講過(guò)趋厉,DataFrame對(duì)象支持等級(jí)索引寨闹。利用這一點(diǎn),可以還從i想你調(diào)整DataFrame對(duì)象中國(guó)呢?cái)?shù)據(jù)觅廓,軸向旋轉(zhuǎn)有兩個(gè)基本操作: - 入棧(Stacking):旋轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)鼻忠,把列旋轉(zhuǎn)為行
- 出棧(unStacking):把行旋轉(zhuǎn)為列
import pandas as pd
import numpy as np
# df對(duì)象應(yīng)用stack函數(shù),會(huì)把列轉(zhuǎn)變?yōu)樾需境瘢瑥亩玫揭粋€(gè)Series對(duì)象
dframe = pd.DataFrame(np.arange(9).reshape(3,3),
index=['white', 'black', 'red'],
columns=['ball', 'pen', 'pencil'])
print(dframe)
print('------------')
print(dframe.stack())
#在這個(gè)具有登記索引結(jié)構(gòu)的Series對(duì)象上執(zhí)行unstack()操作帖蔓,可以重建之前的DataFrame對(duì)象,從而可以以數(shù)據(jù)透視表的形式來(lái)展示Series對(duì)象中的等級(jí)索引結(jié)構(gòu)
dframe = pd.DataFrame(np.arange(9).reshape(3,3),
index=['white', 'black', 'red'],
columns=['ball', 'pen', 'pencil'])
ser = dframe.stack()
print(ser.unstack())
#出椡В可以應(yīng)用不同的層級(jí)塑娇,為unstack()函數(shù)傳入表示層級(jí)的編號(hào)或名稱,即可對(duì)相應(yīng)的層級(jí)進(jìn)行操作劫侧。
ser = dframe.stack()
print(ser.unstack(0))
print('------------')
print(ser.unstack(1))