Pandas 是基于NumPy 的一種工具玄呛,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的阅懦。Pandas 納入了大量庫(kù)和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具徘铝。Pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法耳胎。利用Pandas進(jìn)行數(shù)據(jù)操作、預(yù)處理惕它、清洗是Python數(shù)據(jù)分析中的重要技能怕午。
數(shù)據(jù)被分為三部分:行索引(index),列索引(columns)及數(shù)據(jù)內(nèi)容(data)
Series
Series是Pandas中最基本的對(duì)象淹魄,Series類似一種一維數(shù)組诗轻。事實(shí)上,Series 基本上就是基于 NumPy 的數(shù)組對(duì)象來(lái)的揭北。和 NumPy 的數(shù)組不同,Series 能為數(shù)據(jù)自定義標(biāo)簽吏颖,也就是索引(index)搔体,然后通過(guò)索引來(lái)訪問(wèn)數(shù)組中的數(shù)據(jù)。
- 創(chuàng)建Series半醉,使用默認(rèn)索引
sel = Series(data=[1, 'lackychen', 30, 'a teacher and a student'])
一個(gè)Series其實(shí)就是一條數(shù)據(jù)疚俱,Series方法的第一個(gè)參數(shù)是data,第二個(gè)參數(shù)是index(索引)缩多,如果沒(méi)有傳值會(huì)使用默認(rèn)值(0-N)呆奕。
- 創(chuàng)建Series养晋,使用自定義索引
sel = Series(data=[1, 'lackychen', 30, 'a teacher and a student'], index = ['序號(hào)','姓名','年齡','評(píng)語(yǔ)'])
index參數(shù)是我們自定義的索引值,注意:參數(shù)值的個(gè)數(shù)一定要與元素個(gè)數(shù)相同梁钾。
- 將字典轉(zhuǎn)換為Series
dic={"red":100,"black":400,"green":300,"pink":900}
se2=Series(data=dic)
當(dāng)數(shù)據(jù)是字典的時(shí)候绳泉,會(huì)將字典的鍵作為索引,字典的值作為索引對(duì)應(yīng)的數(shù)據(jù)值姆泻。
Series是一組帶索引數(shù)組零酪,與list相似,一般我們用其承裝一條數(shù)據(jù)或者一行數(shù)據(jù)拇勃。多個(gè)Series可組成一個(gè)DataFrame四苇。
- 通過(guò)values、index方咆、items等Series的屬性來(lái)獲取各部分的全部數(shù)據(jù)
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亞瑟', '后裔','小喬','哪吒' ,'虞姬','王昭君']
series = Series(data=name,index=emp)
# 獲取數(shù)據(jù)的值
print(series.values)
# 獲取索引的值
print(series.index.tolist())
# 獲取每對(duì)索引和值
print(list(series.items()))
values月腋、index、items返回的對(duì)象分別是List瓣赂、Index榆骚、Zip類型的數(shù)據(jù),為了方便我們使用和觀察數(shù)據(jù)钩述,可以使用series.index.tolist()和list(series.items())方法轉(zhuǎn)化成List類型寨躁。
Series就像將索引值暴露在外面的List,其實(shí)它們除了外表相似以外牙勘,在獲取數(shù)據(jù)方面也非常的相似职恳。我們可以通過(guò)索引值來(lái)進(jìn)行單個(gè)數(shù)據(jù)的訪問(wèn),同樣也支持切片選擇多個(gè)數(shù)據(jù)方面。
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亞瑟', '后裔','小喬','哪吒' ,'虞姬','王昭君']
series = Series(data=name,index=emp)
# 使用索引值獲取單個(gè)數(shù)據(jù)
print(series['001'])
# 使用索引值獲取多個(gè)不連續(xù)的數(shù)據(jù)
print('索引下標(biāo)',series[['002','004']])
# 使用切片獲取連續(xù)的數(shù)據(jù)
print('索引切片',series['001':'004'])
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亞瑟', '后裔','小喬','哪吒' ,'虞姬','王昭君']
series = Series(data=emp,index=name)
# 使用位置下標(biāo)獲取單個(gè)數(shù)據(jù)
print(series[0])
# 使用位置下標(biāo)獲取多個(gè)不連續(xù)的數(shù)據(jù)
print('位置下標(biāo)',series[[1,3]])
# 使用位置下標(biāo)切片獲取連續(xù)的數(shù)據(jù)
print('位置切片',series[0:3])
我們自定的index值被叫做索引下標(biāo)放钦,沒(méi)有設(shè)置index值時(shí)會(huì)有一個(gè)默認(rèn)的值叫做位置下標(biāo)。
- 利用循環(huán)來(lái)遍歷Series
直接遍歷Series的值:
# 遍歷并拿到data數(shù)據(jù)
for value in series:
print(value)
通過(guò)keys()遍歷Series的索引:
# 遍歷并拿到index數(shù)據(jù)
for index in series.keys():
print(index)
通過(guò)items()遍歷Series的每對(duì)索引和數(shù)據(jù):
# 遍歷并拿到每對(duì)索引和數(shù)據(jù)
for item in series.items():
print(item)
DataFrame
DataFrame(數(shù)據(jù)表)是一種 2 維數(shù)據(jù)結(jié)構(gòu)恭金,數(shù)據(jù)以表格的形式存儲(chǔ)操禀,分成若干行和列。通過(guò) DataFrame横腿,你能很方便地處理數(shù)據(jù)颓屑。調(diào)用DataFrame()可以將多種格式的數(shù)據(jù)轉(zhuǎn)換為DataFrame對(duì)象,它的的三個(gè)參數(shù)data耿焊、index和columns分別為數(shù)據(jù)揪惦、行索引和列索引。
- 二維列表創(chuàng)建dataframe
lol_list = [ ['上單','TheShy',20], ['打野','小天',19], ['中單','Faker',23], ['ADC','Uzi',22], ['輔助','Ming',21] ]
df = DataFrame(data=lol_list)
有沒(méi)有辦法在創(chuàng)建DataFrame對(duì)象的時(shí)候?yàn)槊恳涣性O(shè)定一個(gè)有意義的名字呢罗侯?我們可以通過(guò)給DataFrame構(gòu)造函數(shù)中的參數(shù)index
,columns
傳值來(lái)設(shè)定DataFrame的中的行器腋、列索引的值。
- 二維列表創(chuàng)建dataframe,自定義index纫塌、columns
lol_list = [ ['上單','TheShy',20], ['打野','小天',19], ['中單','Faker',23], ['ADC','Uzi',22], ['輔助','Ming',21] ]
df = DataFrame(data=lol_list, index=['a','b','c','d','e'], columns=['位置','ID號(hào)','年齡'])
- 使用字典創(chuàng)建dataframe诊县,字典的鍵值作為數(shù)據(jù)的列索引值
dic={ '位置': ['上單', '打野', '中單', 'ADC','輔助'], 'ID號(hào)': ['TheShy', '小天', 'Faker', 'Uzi', 'Ming'], 'year': [20, 19, 23, 22,21]}
df=pd.DataFrame(dic)
可以把 DataFrame 理解成一組采用同樣索引的 Series 的集合。DataFrame處理數(shù)據(jù)常見(jiàn)的操作有選取措左、替換行或列的數(shù)據(jù)依痊,重組數(shù)據(jù)表、修改索引媳荒、多重篩選等抗悍。
DataFrame里的數(shù)據(jù)是按照行和列來(lái)進(jìn)行排列,如何對(duì)DataFrame的數(shù)據(jù)按照行或者列進(jìn)行選擇钳枕、遍歷以及修改缴渊。在這之前我們要清楚DataFrame中的數(shù)據(jù)情況,首先數(shù)據(jù)的維度是一維還是二維的我們可以使用ndim查看鱼炒,數(shù)據(jù)的行數(shù)和列數(shù)使用shape查看衔沼,行、列的索引值使用index昔瞧、columns查看指蚁。
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
# 獲取行數(shù)和列數(shù)
print(df.shape)
# 獲取行索引
print(df.index.tolist())
# 獲取列索引
print(df.columns.tolist())
# 獲取數(shù)據(jù)的維度
print(df.ndim)
數(shù)據(jù)量比較大并且我們想看數(shù)據(jù)的具體情況的時(shí)候,直接打印df比較耗時(shí)自晰,所以我們可以只獲取前幾行或者后幾行凝化,了解數(shù)據(jù)的構(gòu)成即可。這時(shí)候有兩個(gè)法寶head()酬荞、tail()幫我們解決這個(gè)問(wèn)題搓劫。
# 獲取前兩條
df.head(2)
# 獲取后兩條
df.tail(2)
兩個(gè)方法都有默認(rèn)值,默認(rèn)值是5混巧,當(dāng)然也可以自己設(shè)置枪向,如果數(shù)據(jù)不夠5個(gè)會(huì)將全部數(shù)據(jù)拿出來(lái)。
# 通過(guò)位置索引切片獲取一行
print(df[0:1])
# 通過(guò)位置索引切片獲取多行
print(df[1:3])
# 獲取多行里面的某幾列
print(df[1:3][['name','age']])
# 獲取DataFrame的列
print(df['name'])
# 獲取多個(gè)列
print(df[['name','age']])
df[]不支持直接輸入標(biāo)簽索引獲取行數(shù)據(jù)咧党,例如:df['001']秘蛔;
這種方式可以獲取一列數(shù)據(jù),列如:df['name']傍衡;
如果想獲取多行里面的某幾列可寫成:df[行][列]深员,例如:df[1:3][['name','age']],將列索引值放到同一個(gè)列表中,再將列表放到第二個(gè)方括號(hào)中蛙埂。
- 行標(biāo)簽索引篩選loc[]辨液,行位置索引篩選iloc[]:
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
# 獲取某一行某一列的數(shù)據(jù)
print(df.loc['001','name'])
# 某一行多列的數(shù)據(jù)
print(df.loc['001',['name','weight']])
# 一行所有列
print(df.loc['001',:])
# 選擇間隔的多行多列
print(df.loc[['001','003'],['name','weight']])
# 選擇連續(xù)的多行和間隔的多列
print(df.loc['001':'003','name':'weight'])
df.loc[] 通過(guò)標(biāo)簽索引獲取行數(shù)據(jù),它的語(yǔ)法結(jié)構(gòu)是這樣的:df.loc[[行],[列]]箱残,方括號(hào)中用逗號(hào)分隔,左側(cè)是行、右側(cè)是列被辑。注意:如果行或者列使用切片的時(shí)候燎悍,要把方括號(hào)去掉,列df.loc['001':'003','name':'weight']盼理。
df.iloc[] 通過(guò)位置索引獲取行數(shù)據(jù)谈山,他的操作和loc[]操作是一樣的,只要將標(biāo)簽索引改成位置索引就好了宏怔。
# 取一行
print(df.iloc[1])
# 取連續(xù)多行
print(df.iloc[0:2])
# 取間斷的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 某一個(gè)值
print(df.iloc[1,0])
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
print(df.iloc[1])
print(df.iloc[0:2])
print(df.iloc[[0,2],:])
print(df.iloc[:,1])
print(df.iloc[1:3,0:1])
print(df.iloc[1,0])
需要注意的是奏路,loc和iloc的切片操作在是否包含切片終點(diǎn)的數(shù)據(jù)有差異。loc['001':'003']的結(jié)果中包含行索引003對(duì)應(yīng)的行臊诊。iloc[0:2] 結(jié)果中不包含序號(hào)為2的數(shù)據(jù)鸽粉,切片終點(diǎn)對(duì)應(yīng)的數(shù)據(jù)不在篩選結(jié)果中。loc是指location的意思抓艳,iloc中的i是指integer触机。這兩者的區(qū)別如下:
loc:works on labels in the index.
iloc:works on the positions in the index (so it only takes integers).
也就是說(shuō)loc是根據(jù)index來(lái)索引,比如下邊的df定義了一個(gè)index玷或,那么loc就根據(jù)這個(gè)index來(lái)索引對(duì)應(yīng)的行儡首;iloc并不是根據(jù)index來(lái)索引,而是根據(jù)行號(hào)來(lái)索引偏友,行號(hào)從0開(kāi)始蔬胯,逐次加1。
- dataframe數(shù)據(jù)遍歷
iterrows(): 按行遍歷位他,將DataFrame的每一行轉(zhuǎn)化為(index, Series)對(duì)氛濒。index為行索引值,Series為該行對(duì)應(yīng)的數(shù)據(jù)棱诱。
for index,row_data in df.iterrows():
print(index,row_data)
iteritems():按列遍歷泼橘,將DataFrame的每一列轉(zhuǎn)化為(column, Series)對(duì)。column為列索引的值迈勋,Series為該列對(duì)應(yīng)的數(shù)據(jù)炬灭。
for col,col_data in df.iteritems():
print(col)
示例:
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
for index, row_data in df.iterrows():
print(index, row_data)
for col, col_data in df.iterrows():
print(col)
print(col_data)