? ? ?? 寫在前面癣朗,我也是一名python學(xué)習(xí)小白,從最近開始學(xué)習(xí)Python旺罢,由于之前沒(méi)有編程基礎(chǔ)旷余,學(xué)習(xí)起來(lái)比較費(fèi)勁,大部分時(shí)間都是從網(wǎng)上看寫教學(xué)視頻扁达,一邊學(xué)習(xí)正卧,一邊操作。但是大部分情況都是學(xué)完就忘跪解,真正讓自己寫代碼時(shí)炉旷,又總是依賴百度,進(jìn)步很慢,最近也在通過(guò)學(xué)習(xí)Python的數(shù)據(jù)處理包-pandas窘行,分享一些自己在實(shí)際學(xué)習(xí)過(guò)程中練習(xí)的一些代碼饥追,由于是類似比較,所以會(huì)有很多注釋罐盔,幫助自己記憶的但绕。【代碼內(nèi)容是可以直接復(fù)制到Pycharm中直接運(yùn)行的】 ---如需轉(zhuǎn)載惶看,請(qǐng)注明出處捏顺,謝謝。
請(qǐng)關(guān)注我的知乎:Pandas學(xué)習(xí)總結(jié)
import pandas as pd
import numpy as? np
第一部分:Pandas -Series數(shù)據(jù)處理
#pd.Series(data=list,index=[ ],name=”“) 創(chuàng)建:
#通過(guò)字典創(chuàng)建:
dic={"a":[1,2,3],"b":[4,5,6],"c":[7,8,9]}
s1 = pd.Series(data=dic,name="Random_num")? #通過(guò)字典來(lái)創(chuàng)建Series纬黎,字典的Key為index(由于dict中key值不允許重復(fù)幅骄,所以不會(huì)有重復(fù)index),value為Series的value
#通過(guò)字典創(chuàng)建Series也可以指定index本今,如果指定的index與字典中key不一致拆座,則會(huì)按照指定的index進(jìn)行添加,value值會(huì)填充為NaN
#通過(guò)列表創(chuàng)建:
list1=[1,2,3,4]
s2 = pd.Series(data=list1,index=["a","e","f","g"],name="Random")? #通過(guò)列表來(lái)創(chuàng)建Series冠息,可以指定index(可以重復(fù))懂拾,如果不指定默認(rèn)按0-整數(shù)作為index
#獲取Series的name
s1.name
#獲取Series的index
s1.index
#Series中增加數(shù)據(jù):append(to_append,ignore_index=False)? to_append為字典或Series,添加后不會(huì)改變?cè)璖eries的內(nèi)容铐达。
#通過(guò)Series或dict來(lái)增加
s3 = s1.append(s2,ignore_index=True)? #默認(rèn)為False岖赋,添加什么就顯示什么。 True表示為添加后的Series重新進(jìn)行賦index值0-
s3 = s2.append(pd.Series({"h":45}))? #其實(shí)括號(hào)中的字典已經(jīng)被轉(zhuǎn)換成Series再添加瓮孙,所以append添加Series也是只能添加Series類型唐断。
#向Series中添加other對(duì)象,add(other, level=None, fill_value=None, axis=0)
#使用add添加對(duì)象時(shí)杭抠,Series中必須為數(shù)字類型脸甘,否則會(huì)報(bào)錯(cuò)。
s2.add(5)? #就是在s2中每個(gè)value值都增加5偏灿。
s4= s3.add(s2,fill_value=10)? #如果兩個(gè)Series有相同的index丹诀,那么相同的index的值會(huì)直接相加,不同的index會(huì)以fill_value指定的值填充翁垂。
#需要注意: fill_value=10 表示兩個(gè)Series值進(jìn)行相加時(shí)铆遭,如果index不匹配,會(huì)取兩者的并集沿猜,沒(méi)有的那個(gè)Series先講值進(jìn)行填充為指定fill_value值枚荣,然后再兩者相加
#也就是說(shuō),兩個(gè)不同長(zhǎng)度的Series相加時(shí)啼肩,會(huì)先將兩者的長(zhǎng)度對(duì)其橄妆,缺失值填充NaN衙伶,然后再進(jìn)行相加,NaN+數(shù)字 =NaN? 所以也就能理解s4["d"]的值為55了害碾。
#Series中數(shù)據(jù)的選擇: get(key,default=None)? 如果獲取多個(gè)值矢劲,以列表的形式提供
s3.get("e")? #之間通過(guò)index得到對(duì)應(yīng)的值
s3.get(["a","e"],66)? #如果index中沒(méi)有值,則會(huì)輸出指定的值default = 66
#Series中通過(guò)切片取值: 切片取值后的值仍為Series,如果是單個(gè)中就是value了慌随。
type(s3[0])
s3[0:2]
# Series中相加運(yùn)算芬沉。
#對(duì)于均為數(shù)字類型的Series,兩Series進(jìn)行相加時(shí)儒陨,相同的index會(huì)進(jìn)行相加花嘶,不同的index按照NaN值進(jìn)行填充笋籽。
#NaN屬于float類型蹦漠,表示缺失數(shù)據(jù),可以參與運(yùn)算车海。
s5 = s2+s3
# Series中缺失值操作
s1.notnull()? #判斷Series中是否存在缺失值笛园,不是空值(也就是不為NaN)返回True,為空值(就是為NaN)返回False侍芝。
s5.isnull()? #判斷Series中是否存在空值研铆,返回的時(shí)Series對(duì)象的布爾值。不為空州叠,返回False棵红,為空值,返回True咧栗。
#該操作可以在Series中對(duì)數(shù)據(jù)進(jìn)行篩選操作逆甜,例如:
s5[s5.isnull()]? #篩選出s5中為空值的行(數(shù)值),同樣也適用在對(duì)DataFrame的操作中。
s5[s5.notnull()]? #篩選出s5中不為空值的行(數(shù)值)致板。
#Series中缺失值的填充
s5.fillna(6)? # 就是將s5中的NaN值填充為6
#Series中缺失值的刪除
s5.dropna(inplace=True)? #對(duì)于Series交煞,直接就是刪除NaN的值,返回的是刪除NaN后的Series斟或,但是原來(lái)的Series不會(huì)改變素征。
#如果指定了inplace = True 則原來(lái)的Series會(huì)改變,默認(rèn)inplace=False
#Series中對(duì)數(shù)據(jù)的去重操作
s5.unique()? #去除Series中的重復(fù)值萝挤,返回元素的唯一值御毅。
s5.nunique()? #返回s1的唯一值的個(gè)數(shù),返回的是單個(gè)值怜珍。
s5.fillna(77)
#統(tǒng)計(jì)Series中值出現(xiàn)的次數(shù)
s5.value_counts()? #統(tǒng)計(jì)Series中的值出現(xiàn)的次數(shù)亚享。
#判斷某值是否存在Series中
s5.isin([4,5,6,7])? #判斷Series是否存在[4,5,6,7]這個(gè)列表中,返回對(duì)應(yīng)的bool類型Series绘面。
#對(duì)Series中數(shù)據(jù)按照值的順序進(jìn)行排序
s5.sort_values(ascending=False,inplace=False,na_position="last")? #對(duì)于Series按照值排序不需要指定by 和axis 的值欺税。
#對(duì)Series中按照索引的順序進(jìn)行排序
s5.sort_index(level=None,ascending=True,inplace=False,na_position="last")? #對(duì)于Series參數(shù)axis是不需要的侈沪。by參數(shù)不建議使用。
# Series系列對(duì)象屬性
# Series.inddex #返回Series的index對(duì)象
# Series.shape? #返回Series的形狀元組
# Series.dtype? #返回Series的數(shù)據(jù)類型
# Series.size? #返回Series的數(shù)據(jù)大小晚凿,數(shù)據(jù)的個(gè)數(shù)
# Series.ndim? #返回?cái)?shù)據(jù)中的維數(shù)
第二部分:Pandas - DataFrame數(shù)據(jù)處理
#pd.DataFrame的創(chuàng)建: pd.DataFrame(data= , index=[] ,columns=[],dtypes="int")
#通過(guò)字典進(jìn)行創(chuàng)建
dict1 = {"a":[1,2,3],"b":[4,5,6],"c":[7,8,9],"d":[10,11,12]}
df = pd.DataFrame(data = dict1,index=[3,4,5],columns=["b","a","c","d"])? #通過(guò)dict進(jìn)行創(chuàng)建DataFrame時(shí)亭罪,不需要指定columns,如果指定的columns值與dict的Key不一致時(shí)歼秽,會(huì)填充NaN的值应役。
#通過(guò)numpy創(chuàng)建
df1=pd.DataFrame(np.random.randint(3,8),columns=["a","b","c"],index=[1,2,3])
#通過(guò)讀取csv/txt/excel文件進(jìn)行創(chuàng)建? pd.read_excel("文件路徑+文件名+擴(kuò)展名",encoding ="gbk",index_col=0,skiprows=[1],header = None )
#index_col 指定行索引的列
#header 指定列索引的行,默認(rèn)header = 0
#usecols 指定只使用那些列燥筷,默認(rèn)為None箩祥,全部使用
#skiprows 指定跳過(guò)哪些行
#dtype #設(shè)置列的類型,一般可以通過(guò)字典來(lái)進(jìn)行設(shè)置肆氓,如 dtype = {"列名":"類型"}
#sheet_name = 0 #表示讀取excel中的哪張表袍祖,可以寫表的名字,也可以寫index索引谢揪,0代表第一張表蕉陋,1代表第二張表
df3 = pd.read_csv(r"C:\Users\11764\Desktop\DataAnalyst.csv",encoding="gbk")
df3
#DataFrame屬性:
df.columns? #以index形式,返回df的列名稱拨扶,因此可以通過(guò)修改列名凳鬓,df.columns=list[] ,可以對(duì)列名進(jìn)行修改
#還可以通過(guò)rename的方法對(duì)columns進(jìn)行修改,df.rename(columns={"A":"B"},inplace = True) 將A列的名稱更改為"B"
df.index? #以index形式患民,返回df的索引
df.shape? #返回df的形狀(幾行幾列)? df.shape[0] 返回df的行數(shù)? df.shape[1] 返回df的列數(shù)
df3.size? #返回df的數(shù)據(jù)個(gè)數(shù) 幾行*幾列的值
df.values? #以數(shù)組的形式缩举,返回df的值
df.dtypes? #以Series形式返回df的中每列數(shù)據(jù)的類型
df.ndim? #以數(shù)字的形式返回df的維度
df.T? ? ? # 將df進(jìn)行轉(zhuǎn)置,將數(shù)據(jù)的行變成列匹颤,將列變成行
df.info()? #查看表中數(shù)據(jù)的類型
# DataFrame 數(shù)據(jù)選擇
#df[] 默認(rèn)是對(duì)列進(jìn)行選擇仅孩,如果需要選擇對(duì)應(yīng)行列中的值,需要先選擇列惋嚎,再選擇行杠氢。即df["columns"]["index"]? 否則會(huì)報(bào)錯(cuò)。? 輸入?yún)?shù)的位置是:先列后行
'''后續(xù)可以通過(guò)df["new_columns"]= list[]? 來(lái)新增列另伍。'''
df[1:5]? #選取1:4行的數(shù)據(jù)
df["a"]? #選擇columns=3的列鼻百,? df[] 只有一個(gè)參數(shù)是默認(rèn)是選擇列
df[["a","b"]]? #選擇的是不連續(xù)的兩列
# df["b":"c"] #選擇的是連續(xù)的列
df[1:3]? #選擇的是第2行到第3行的值,不包括第4行
df[:]? ? #表示選擇所有的行
df[:2]? #表示選擇前兩行的值
df["a"][3]? #表示選擇"a" 列中對(duì)應(yīng)的index=3 的值摆尝。? #建議在進(jìn)行設(shè)置index值時(shí)温艇,不要選擇整型作為新的index,本來(lái)默認(rèn)為整型堕汞,容易形成混淆勺爱。
# 此時(shí)的3 表示index值為3,與實(shí)際參數(shù)位置3有明顯區(qū)別讯检,也就是使用整型做index 的弊端琐鲁。
#通過(guò)loc 和iloc 進(jìn)行取值
#loc 是根據(jù)行列標(biāo)簽來(lái)進(jìn)行選擇.? 需要取多列卫旱,將多列的標(biāo)簽放在列表[]中。 輸入?yún)?shù)的位置是:先行后列
# df.loc[]? 如果只有一個(gè)參數(shù)围段,默認(rèn)是選擇行的顾翼。 需要注意:與df[] 只有一個(gè)參數(shù)默認(rèn)是選擇列的。
df.loc[3]? #選擇index=3對(duì)應(yīng)的行奈泪。
''' 后續(xù)可以通過(guò)df.loc["new_index"] = list[] ,該方式對(duì)DataFrame新增行适贸。'''
df.loc[:]? #表示選擇所有的行
df.loc[3,"a"]? #表示取index=3的行對(duì)應(yīng)"a"列對(duì)應(yīng)的值。
df.loc[:,"a"]? #表示取"a" 列的所有值涝桅。
df.loc[3,:]? # 表示取index=3 對(duì)應(yīng)行的所有值拜姿。
#iloc 是根據(jù)行列的位置來(lái)進(jìn)行取值的。? 如果只有一個(gè)參數(shù)冯遂,則默認(rèn)選擇取行蕊肥。? 輸入?yún)?shù)的位置是: 先行后列
df.iloc[2]? #選擇位置參數(shù)為2(對(duì)應(yīng)第3行)的數(shù)據(jù)。
df.iloc[[1,2]]? #表示選擇第2行和第三行的數(shù)據(jù)债蜜。
df.iloc[1,2]? #表示取第2行和第3列對(duì)應(yīng)的數(shù)值
df.iloc[[1,2],[1,2]]? #表示取第2行和第3行晴埂,對(duì)應(yīng)的第2列和第3列的數(shù)據(jù)究反。
''''
數(shù)據(jù)選擇總結(jié):
df.loc[2],df.iloc[1]? 只有一個(gè)參數(shù)表示是對(duì)行進(jìn)行選擇寻定。
默認(rèn)情況下 df[] 只能通過(guò)columns進(jìn)行列選擇,不能進(jìn)行行選擇精耐,如果含有行號(hào)和區(qū)間狼速,如df[:2] 是可以進(jìn)行行選擇。
df.columns? 表示選擇的columns這列卦停,等價(jià)于 df["columns"]
'''
#DataFrame 數(shù)據(jù)的預(yù)處理-行列操作
#df.pop(item)? #itme 指列標(biāo)簽向胡,表示指定刪除的列,并彈出刪除列的值惊完。不能作用于行
df.pop("a")? #刪除df中的對(duì)應(yīng)的"a" 列僵芹,原df數(shù)據(jù)會(huì)被改變。
#df.get(key,default=None)? key表示指定的列索引標(biāo)簽小槐,如果df中有列索引拇派,則返回該列的值,沒(méi)有的話返回default的值凿跳。
df.get("b")
#df.insert(loc,column,value,allow_duplicates=False)? 在df的指定位置插入一列件豌。? 不能作用于行。
''' loc 以int表示控嗜,表示插入列的位置茧彤,0
column 以str,number,object? 表示插入列的標(biāo)簽
value 以int,Series疆栏,array-like 表示插入列的值
allow_duplicates 以bool類型表示曾掂,如果原df中有對(duì)應(yīng)標(biāo)簽惫谤,True表示允許一樣,F(xiàn)alse表示不能一樣珠洗。'''
df.insert(2,"k",[15,13,17])
#對(duì)df中行或列數(shù)據(jù)進(jìn)行排序石挂。
# df.sort_values(by="" ,axis=0,ascending =True,inplace =False,na_position='last',ignore_index=False)
'''by=""? ? 指定行索引名(“index”)或者列索引(“cloumns”),參數(shù)需要以列表[]的形式進(jìn)行提供。
axis=0/1? 若axis=0或"index"按照指定列中數(shù)據(jù)大小進(jìn)行排序险污,若axis=1或"columns",則按照指定行索引中數(shù)據(jù)大小進(jìn)行排序痹愚,默認(rèn)axis=0
ascending=True/False? 是否按照指定列進(jìn)行升序排序,默認(rèn)為True蛔糯,即升序排列拯腮。
inplace=True/False? 是否使用排序后的數(shù)據(jù)集更替原來(lái)的數(shù)據(jù)集,默認(rèn)為False蚁飒,即不替換动壤。
na_position="frist" 或“l(fā)ast”? 設(shè)置缺失值的顯示位置。'''
df.sort_values(by=[3],axis=1)? #表示按照index=3 對(duì)列進(jìn)行排序淮逻,axis=1 表示跨行操作琼懊,也就是橫向排序
df.sort_values(by=["b"],axis=0)? #表示按照列名"a",對(duì)行進(jìn)行排序,axis=0 表示跨列操作爬早,也就是縱向排序
df["b"].sort_values()? #表示的是對(duì)“a“ 列的數(shù)據(jù)進(jìn)行值排序哼丈,返回的是"a" 列數(shù)據(jù)排序后的Series。
# 對(duì)df中的數(shù)據(jù)按照index進(jìn)行排序
#sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
'''
axis:0按照行名排序筛严;1按照列名排序
level:默認(rèn)None醉旦,否則按照給定的level順序排列---貌似并不是,文檔
ascending:默認(rèn)True升序排列桨啃;False降序排列
inplace:默認(rèn)False车胡,否則排序之后的數(shù)據(jù)直接替換原來(lái)的數(shù)據(jù)框
kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’照瘾。似乎不用太關(guān)心匈棘。
na_position:缺失值默認(rèn)排在最后{"first","last"}
by:按照某一列或幾列數(shù)據(jù)進(jìn)行排序,但是by參數(shù)貌似不建議使用
'''
df.sort_index(ascending=False)? # axis 按照指定的行或列進(jìn)行排序析命。
#對(duì)DataFrame中的數(shù)據(jù)設(shè)置索引值主卫,也就是指定某一列作為列索引。
#df.set_index(keys,drop=True,append=False,inplace=False,verify_integrity=False)
'''
drop:默認(rèn)為True碳却,刪除用作新索引的列
append:是否將附加到現(xiàn)有索引队秩,默認(rèn)為False? ##通俗來(lái)講,就是設(shè)置后的索引是否與原來(lái)的索引同時(shí)存在昼浦,True表示現(xiàn)索引和原索引同時(shí)并存
inplace:輸入布爾值馍资,表示當(dāng)前操作是否對(duì)原數(shù)據(jù)進(jìn)行修改,默認(rèn)為False
verify_integrity :檢查新索引副本。默認(rèn)為False
'''
df.set_index("k")
#對(duì)df中將設(shè)置的索引回復(fù)到默認(rèn)的索引值,與set_index 構(gòu)成反向操作鸟蟹。
# df.reset_index(level=None,drop=False,inplace=False,col_level=0,col_fill=" ")
'''
將原來(lái)設(shè)置為索引的列進(jìn)行還原乌妙,新的索引列默認(rèn)填充,設(shè)置索引列的列回到df數(shù)據(jù)中建钥,如果drop=True藤韵,則設(shè)置為索引列的列會(huì)被丟棄。
簡(jiǎn)單理解就是通過(guò)set_index 設(shè)置的df的index熊经,現(xiàn)在又不想用了泽艘,可以直接df.reset_index(),又回到原來(lái)的默認(rèn)值了
Level :當(dāng)指定數(shù)值類型可以為int,str镐依,tuple或list匹涮,默認(rèn)為None(無(wú))
Drop:當(dāng)指定drop=False時(shí),則索引列會(huì)被還原為普通列槐壳,否則為True時(shí)然低,經(jīng)設(shè)置后的新索引值會(huì)被丟棄,默認(rèn)為False务唐。
inplace:True/False 表示當(dāng)前操作是否對(duì)原數(shù)據(jù)生效雳攘,默認(rèn)為False
Col_level :數(shù)值類型為int或str,默認(rèn)值為0枫笛,如果列有多個(gè)級(jí)別吨灭,則確定將標(biāo)簽插入到哪個(gè)級(jí)別,默認(rèn)情況下將插入到第一級(jí)崇堰。
Col_fill:對(duì)象沃于,默認(rèn)“ ”
'''
df.reset_index()
#將已有的df中的index或columns設(shè)置成自定義的index或columns涩咖,如果新設(shè)置的index或columns在原df中存在海诲,會(huì)對(duì)原df進(jìn)行且切片,否則會(huì)對(duì)應(yīng)的值填充NaN值檩互。
#df.reindex(labels=None,index=None,columns=None,axis=None,method=None,copy=None,level=None,fill_value=nan,limit=None,tolerance=None)
df.reindex(labels="a",index=[1,2,3]) #如果指定了index=[] ,就不需要再傳入axis參數(shù)了特幔。
#修改原df的index或columns名
'''
簡(jiǎn)單理解就是原來(lái)的df的index和column已經(jīng)有了默認(rèn)名稱,現(xiàn)在我想重新修改名稱闸昨,我可以只修改幾個(gè)名稱蚯斯,或者覺(jué)得index或columns中有些名稱不想要,
想改饵较,可以通過(guò)字典形式進(jìn)行映射修改拍嵌,但是修改后的df的維度不會(huì)發(fā)生改變,不會(huì)像reindex那樣可以新增或者切片循诉。
但是rename修改名稱時(shí)横辆,index或columns需通過(guò)字典值映射。index={"原名":"新名"},columns={"原名":"新名"}
'''
df.rename(index={3:6},columns={"k":"g"})? #將df中的index索引3修改為6茄猫,將columns中"k"修改成"g"狈蚤。
? ? ? ? ? 【內(nèi)容持續(xù)更新...如果覺(jué)得對(duì)你有幫助困肩,幫忙點(diǎn)個(gè)收藏和關(guān)注,謝謝脆侮!】