一辣辫、Series數(shù)列
Series
Series是一種類似與一維數(shù)組的對象,由下面兩個部分組成:
values:一組數(shù)據(jù)(ndarray類型)
index:相關(guān)的數(shù)據(jù)索引標(biāo)簽
Series的創(chuàng)建
第一種:由列表或numpy數(shù)組創(chuàng)建
列表創(chuàng)建:
Series([1,2,3,4,5],index=['a','b','c','d','e'],name='Hello')
ndarray創(chuàng)建
a1 = np.array([1,2,3,4,5])
Series(a1,index=["a","b","c","d","e"],name='hello')
第二種:由字典創(chuàng)建:不能在使用index.但是依然存在默認(rèn)索引
注意:數(shù)據(jù)源必須為一維數(shù)據(jù)
dict = {'hello':12,'hey':30}
Series(data=dict)
Series的索引
可以使用中括號取單個索引(此時返回的是指定索引的元素)鲫骗,或者中括號里一個列表取多個索引(此時返回的是一個Series類型)殖卑。
s1 = Series(data=[1,2,3],index=['a','b','c'])
----> s1[1] 返回的是指定索引的元素
----> s1[[0,1]] 返回的是一個Series類型
顯式索引:
使用index中的元素作為索引值,
使用s.loc[](推薦):注意些侍,loc中括號中放置的一定是顯示索引
----> s1.b
----> s1.loc["b"]
隱式索引
使用.iloc[](推薦):iloc中的中括號中必須放置隱式索引
----> s1.iloc[1]
Series切片:隱式索引切片和顯示索引切片
顯示索引切片:index和loc
s1["a":"c"]
根據(jù)index切
s1.loc["a":"c"]
根據(jù)loc切
隱示索引切片:整數(shù)索引值和iloc
s1[0:2]
根據(jù)整數(shù)索引值切
s1.iloc[0:2]
根據(jù)iloc切
Series的基本概念
可以把Series看成一個定長的有序字典
向Series增加一行:相當(dāng)于給字典增加一組鍵值對可以通過shape,size政模,index,values等得到series的屬性
可以使用s.head(n),tail(n)分別查看前n個和后n個值
當(dāng)索引沒有對應(yīng)的值時岗宣,可能出現(xiàn)缺失數(shù)據(jù)顯示NaN(not a number)的情況
可以使用pd.isnull(),pd.notnull()淋样,或s.isnull(),notnull()函數(shù)檢測缺失數(shù)據(jù)
Series的運算
+ - * /
add()/sub()/mul()/div()
s1.div(s2,fill_value=9)
在運算中自動對齊不同索引的數(shù)據(jù)耗式,如果索引不對應(yīng),則補NaN
二趁猴、DataFarme(數(shù)據(jù)幀)
DataFarme認(rèn)識
DataFrame是一個【表格型】的數(shù)據(jù)結(jié)構(gòu)刊咳。DataFrame由按一定順序排列的多列數(shù)據(jù)組成。設(shè)計初衷是將Series的使用場景從一維拓展到多維儡司。DataFrame既有行索引娱挨,也有列索引。
行索引:index
列索引:columns
值:values
DataFrame(數(shù)據(jù)幀)的創(chuàng)建
最常用的方法是傳遞一個字典來創(chuàng)建捕犬。DataFrame以字典的鍵作為每一【列】的名稱跷坝,以字典的值(一個數(shù)組)作為每一列酵镜。
此外,DataFrame會自動加上每一行的索引柴钻。
使用字典創(chuàng)建的DataFrame后淮韭,則columns參數(shù)將不可被使用。
同Series一樣贴届,若傳入的列與字典的鍵不匹配靠粪,則相應(yīng)的值為NaN。
使用字典創(chuàng)建DataFarme
dict = {"java":[90,22,66],'python':[12,33,66]}
DataFrame(data=dict,index=['章傘','里斯','魍伍'])
使用ndarray創(chuàng)建DataFrame
DataFrame(data=np.random.randint(0,100,size=(3,6)),index=["one","two","three"],columns=["呵","哈","嘿","嘻","嗨","嗚"])
DataFarme屬性
DataFrame屬性:values粱腻、columns庇配、index、shape
DataFrame的索引
對列進行索引
-- 通過類似字典的方式 df['q']
-- 通過屬性的方式 df.q
可以將DataFrame的列獲取為一個Series绍些。返回的Series擁有原DataFrame相同的索引捞慌,且name屬性也已經(jīng)設(shè)置好了,就是相應(yīng)的列名柬批。
--- df["呵"]
--- df.呵
--- df[["呵","哈","嘿"]]
修改列索引
df.columns = ['1','2','3',"4","5","6"]
對行進行索引
使用.loc[]加index來進行行索引
使用.iloc[]加整數(shù)來進行行索引
同樣返回一個Series啸澡,index為原來的columns。
--- df.loc["one"]
--- df.loc[["one","two"]]
--- df.loc["one":"three"]
--- df["one":"three"]
--- df["one":"three"]["嘿"]
修改行索引
--- df.index = [1,2,3]
對元素索引的方法
行索引在前氮帐,列索引在后
--- df.loc["one"]["哈"]
--- df.iloc[0]["哈"]
DataFrame的列刪除
df.drop("列名",axio=1,inplace=True)
DataFarme的切片
--- df.loc["one":"three","呵":"嘿"]
--- df.loc["one":"two"][["呵","嗚"]]
--- df.loc["one":"two",["呵","嗚","哈"]]
--- df.loc[["one"],["呵","嗚","哈"]]
DataFrame的運算
同Series一樣:
在運算中自動對齊不同索引的數(shù)據(jù)
如果索引不對應(yīng)嗅虏,則補NaN
處理丟失數(shù)據(jù)
有兩種丟失數(shù)據(jù):None、np.nan(NaN)
None是Python自帶的上沐,其類型為python object皮服。因此,None不能參與到任何計算中参咙。
np.nan是浮點類型龄广,能參與到計算中。但計算的結(jié)果總是NaN蕴侧。pandas中None與np.nan都視作np.nan
pandas處理空值操作
isnull(). 判斷函數(shù)
notnull() 判斷函數(shù)
dropna(): 過濾丟失數(shù)據(jù)
df.dropna() 可以選擇過濾的是行還是列(默認(rèn)為行):axis中0表示行择同,1表示的列
fillna(): 填充丟失數(shù)據(jù)
很多時候?qū)⒖罩等糳ropna()掉是不現(xiàn)實的,所以需要用fillna()填充空值净宵。
df.fillna(value=100) 或者 df.fillna(method="ffill",axis=0)
method 控制填充的方式敲才,可以選擇前向填充還是后向填充
DataFrame的數(shù)據(jù)過濾
df.query(expr, inplace=False, **kwargs),可以指定一個字符串形式的篩選條件 邏輯與& 或 | ==
df.shift() 該函數(shù)主要的功能就是使數(shù)據(jù)框中數(shù)據(jù)整體移動
df.shift(1)
三择葡、創(chuàng)建多層列索引
隱式構(gòu)造
最常見的方法是給DataFrame構(gòu)造函數(shù)的index或者columns參數(shù)傳遞兩個或更多的數(shù)組
df = DataFrame(data=np.random.randint(80,100,size=(2,4)),index=['tom','jay'],columns=[['qz','qz','qm','qm'],['chinese','math','chinese','math']])
顯示構(gòu)造pd.MultiIndex.from_
使用數(shù)組方式
創(chuàng)建了一個索引對象紧武,該索引對象為二層索引
indexObj = pd.MultiIndex.from_arrays([['qz','qz','qm','qm'],['chinese','math','chinese','math']])
創(chuàng)建DF對象
DataFrame(data=np.random.randint(80,100,size=(2,4)),index=['tom','jar'],columns=indexObj)
使用product方式
最簡單,推薦使用
col=pd.MultiIndex.from_product([['qizhong','qimo'], ['chinese','math']])
創(chuàng)建DF對象
df = DataFrame(data=np.random.randint(10,100,size=(2,4)),index=['tom','jay'], columns=col)
多層行索引
除了列索引敏储,行索引也能用上述同樣的方法創(chuàng)建多層行索引
多層索引對象的索引與切片操作
注意在對行索引的時候脏里,若一級行索引還有多個,對二級行索引會遇到問題虹曙!也就是說迫横,無法直接對二級索引進行索引番舆,必須讓二級索引變成一級索引后才能對其進行索引!總結(jié):
訪問一列或多列 直接用中括號[columnname] 矾踱、[[columname1,columnname2...]]
訪問一行或多行 .loc[indexname]
訪問某一個元素 .loc[indexname,columnname]
行切片 .loc[index1:index2]
列切片 .loc[:,column1:column2]
聚合操作
所謂的聚合操作:平均數(shù)恨狈,方差,最大值呛讲,最小值……
使用value_counts()函數(shù)禾怠,統(tǒng)計列中各個元素出現(xiàn)次數(shù)
使用unique()函數(shù)查看一列中有哪些元素
四、pandas的拼接操作(類似數(shù)據(jù)庫的聯(lián)表)
pandas的拼接分為兩種:
級聯(lián):pd.concat, pd.append
合并:pd.merge, pd.join
----級聯(lián)
pandas使用pd.concat級聯(lián)函數(shù)贝搁,與np.concatenate函數(shù)類似吗氏,只是多了一些參數(shù):
objs 級聯(lián)的對象
axis=0 軸向
keys:列表,列表元素表示的是進行級聯(lián)的df的一個名稱
join='outer' / 'inner':表示的是級聯(lián)的方式雷逆,outer會將所有的項進行級聯(lián)(忽略匹配和不匹配)弦讽,而inner只會將匹配的項級聯(lián)到一起,不匹配的不級聯(lián)
ignore_index=False匹配級聯(lián)
df1 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C'])
pd.concat([df1,df1],axis=0)
不匹配級聯(lián)
不匹配指的是級聯(lián)的維度的索引不一致膀哲。例如縱向級聯(lián)時列索引不一致往产,橫向級聯(lián)時行索引不一致
不匹配級聯(lián)有2種連接方式:
外連接:補NaN(默認(rèn)模式)
內(nèi)連接:只連接匹配的項
df1 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C'])
df2 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','c','d'],columns=['A','C','D'])
外鏈接:pd.concat([df1,df2],axis=1,join="outer")
內(nèi)鏈接:pd.concat([df1,df2],axis=0,join="inner")
內(nèi)鏈接指定keys:pd.concat([df1,df2],axis=1,join="inner",keys=['AAA','BBB'])
df.append()函數(shù)級聯(lián)
由于在后面級聯(lián)的使用非常普遍,因此有一個函數(shù)append專門用于在后面添加
df1.append(df2)
----合并
使用pd.merge()合并
merge與concat的區(qū)別在于某宪,merge需要依據(jù)某一共同的列來進行合并
使用pd.merge()合并時仿村,會自動根據(jù)兩者相同column名稱的那一列,作為key來進行合并兴喂。
注意每一列元素的順序不要求一致參數(shù)
how:out取并集 inner取交集
on:當(dāng)有多列相同的時候蔼囊,可以使用on來指定使用那一列進行合并,on的值為一個列表
一對一合并
df1 = DataFrame({'employee':['Bob','Jake','Lisa'],'group':['Accounting','Engineering','Engineering'],})
df2 = DataFrame({'employee':['Lisa','Bob','Jake'],'hire_date':[2004,2008,2012],})
merge合并:pd.merge(df1,df2)
多對一合并
df3 = DataFrame({'employee':['Lisa','Jake'],'group':['Accounting','Engineering'],'hire_date':[2004,2016]})
df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],'supervisor':['Carly','Guido','Steve']})
pd.merge(df3,df4)
多對多合并
略key的規(guī)范化使用
當(dāng)列沖突時衣迷,即有多個列名稱相同時压真,需要使用on=來指定哪一個列作為key,配合suffixes指定沖突列名蘑险。
pd.merge(df1,df2,on="group",suffixes=('_甲','乙'),how="outer")
注意:當(dāng)兩張表沒有可進行連接的列時,可使用left_on和right_on手動指定merge中左右兩邊的哪一列列作為連接的列
內(nèi)合并與外合并:
外合并outer:取并集岳悟,補NaN
內(nèi)合并inner:取交集佃迄,保留兩者都有的key
五、pandas數(shù)據(jù)處理
1贵少、檢測重復(fù)行 duplicated()
使用duplicated()函數(shù)檢測重復(fù)的行呵俏,返回元素為布爾類型的Series對象,每個元素對應(yīng)一行滔灶,如果該行不是第一次出現(xiàn)普碎,則元素為True
keep參數(shù):指定保留哪一重復(fù)的行數(shù)據(jù)
True 重復(fù)的行2.刪除重復(fù)行 drop_duplicates()
使用drop_duplicates()函數(shù)刪除重復(fù)的行
drop_duplicates(keep='first/last'/False)
2. 映射:指定替換
replace()函數(shù):替換元素
使用replace()函數(shù),對values進行映射操作Series替換操作replace()
單值替換
普通替換
s.replace(to_replace=2,value='two',inplace=True)
字典替換(推薦)
s.replace(to_replace={2:'two'},inplace=True)
多值替換
列表替換
s.replace(to_replace=[1,5],value=['one','five'])
字典替換(推薦)
s.replace(to_replace={3:'three',4:'four'},inplace=True)
參數(shù)
to_replace:被替換的元素
method:對指定的值使用相鄰的值填充替換
limit:設(shè)定填充次數(shù)DataFrame替換操作
單值替換
普通替換: 替換所有符合要求的元素,沒有要替換的值也不會報錯:
df.replace(to_replace=64,value='aaa')
按列指定單值替換: to_replace={列標(biāo)簽:替換值} ,value='value'
df.replace(to_replace={2:85},value='eight')
多值替換
列表替換: to_replace=[] value=[]
df.replace(to_replace=[9,0],value=['a','b'])
字典替換(推薦) to_replace={to_replace:value,to_replace:value}
df.replace(to_replace={1:"one",30:"thirty"})
注意:DataFrame中录平,無法使用method和limit參數(shù)
3. map()函數(shù):新建一列
map是Series的一個函數(shù)
map()可以映射新一列數(shù)據(jù)
map()中可以使用lambd表達(dá)式
map()中可以使用方法麻车,可以是自定義的方法
注意 map()中不能使用sum之類的函數(shù)缀皱,for循環(huán)
df = DataFrame(data=[['zhangsan',1000,'sale'],['lisi',2000,'dev'],['wangwu',3333,'dev']],columns=['name','salary','dep'])
增加名為e_name列:
df['e_name'] = df['name'].map({'lisi':'Tony','zhangsan':'Tom','wangwu':'Jerry'})
map當(dāng)做一種運算工具,至于執(zhí)行何種運算动猬,是由map函數(shù)的參數(shù)決定的
(參數(shù):lambda啤斗,函數(shù))
-- 使用自定義函數(shù)
def func():
...
return xxx
df['salary'].map(func)
-- 使用lambda表達(dá)式
df['salary'].map(lamada x:x..)
注意:并不是任何形式的函數(shù)都可以作為map的參數(shù)。只有當(dāng)一個函數(shù)具有一個參數(shù)且有返回值赁咙,那么該函數(shù)才可以作為map的參數(shù)钮莲。
4. 使用聚合操作對數(shù)據(jù)異常值檢測和過濾
使用df.std()函數(shù)可以求得DataFrame對象每一列的標(biāo)準(zhǔn)差
此處不再做詳細(xì)解讀
5. 排序
--使用sort_value()排序
d f.sort_values(by="列名",axis=0,ascending=False)
-- 使用.take()函數(shù)排序
take()函數(shù)接受一個索引列表,用數(shù)字表示,使得df根據(jù)列表中索引的順序進行排序
df.take([1,2,0],axis=0)
-- 可以借助np.random.permutation()函數(shù)隨機排序
np.random.permutation(x)可以生成x個從0-(x-1)的隨機數(shù)列
arr = np.random.permutation(4)
df.take(arr,axis=1)
隨機抽樣:當(dāng)DataFrame規(guī)模足夠大時彼水,直接使用np.random.permutation(x)函數(shù)崔拥,就配合take()函數(shù)實現(xiàn)隨機抽樣
6.數(shù)據(jù)分類處理【重點】
數(shù)據(jù)聚合是數(shù)據(jù)處理的最后一步,通常是要使每一個數(shù)組生成一個單一的數(shù)值凤覆。數(shù)據(jù)分類處理:
分組:先把數(shù)據(jù)分為幾組
用函數(shù)處理:為不同組的數(shù)據(jù)應(yīng)用不同的函數(shù)以轉(zhuǎn)換數(shù)據(jù)
合并:把不同組得到的結(jié)果合并起來
數(shù)據(jù)分類處理的核心:
groupby()函數(shù)
groups屬性查看分組情況
分組后的聚合操作:分組后的成員中可以被進行運算的值會進行運算链瓦,不能被運算的值不進行運算unstack()與reset_index()對比:
針對多列分組情況,使用unstack(level=1)將上面所得分組數(shù)據(jù)指定的索引變成列索引叛赚。
把索引變成列,Series.reset_index()
pandas數(shù)據(jù)讀取和寫入:
1.pandas提供了一些用于將表格型數(shù)據(jù)讀取為DataFrame對象的函數(shù)澡绩,期中read_csv和read_table這兩個使用最多。
2.使用read_csv讀取url獲取網(wǎng)絡(luò)上的數(shù)據(jù)
3.通過to_excel(path)俺附、to_sql("sql語句",conn)等方式將數(shù)據(jù)寫入對應(yīng)的文件或數(shù)據(jù)庫
案例分析:
使用numpy肥卡、pandas分析美國2010年各州人口密度全代碼github鏈接
https://github.com/wangjifei121/Data_analysis_case1
分析美國2012年總統(tǒng)候選人政治獻金數(shù)據(jù)分析全代碼github鏈接
https://github.com/wangjifei121/Data_analysis_case2