Pandas入門

NumPy、Pandas、Scipy是python的三個(gè)庫,也是數(shù)據(jù)分析的常用庫。其中,numpy學(xué)習(xí)強(qiáng)烈推薦NumPy中文文檔。Pandas是基于NumPy的一種工具,數(shù)據(jù)操作更加方便,這里總結(jié)了Pandas的一些教程,更多內(nèi)容查看官方文檔說明。

安裝包
pip install pandas
載入包
import pandas as pd
創(chuàng)建數(shù)組

pandas常用數(shù)據(jù)結(jié)構(gòu)中,一維Series,二維DataFrame,三維Panel。
Series 數(shù)據(jù)結(jié)構(gòu)與list相似,但只允許存儲(chǔ)相同的數(shù)據(jù)類型,同時(shí),Series可以自定義索引,索引默認(rèn)從0開始遞增。

pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

pd.Series(["小蘭","女",24,"Beijing"],list("abcd"))

輸出:


a 小蘭
b 女
c 24
d Beijing
dtype: object


DataFrame 可看做Series組成的字典,通常定義DataFrame可用dict定義,類似于excel和myslq的表格。
pd.DataFrame(data = None, index = None, columns = None, dtype = None, copy = False )

#舉例
dict = {"name": ["小蘭","小民","小紅"],
       "sex":["女","男","女"],
       "age":[24,20,21],
       "city":["Beijing","Beijing","Tianjin"]}
df = pd.DataFrame(dict)

輸出:

name sex age city
a 小蘭 24 Beijing
b 小民 20 Beijing
c 小紅 21 Tianjin

DataFrame還可以通過info直接查看數(shù)據(jù)類型和統(tǒng)計(jì),dtypes查看數(shù)據(jù)類型,shape查看形狀,describe匯總統(tǒng)計(jì)。

df.info()
df.dtypes
df.shape
df.describe()

info()輸出如下,可以查看數(shù)據(jù)類型和數(shù)量,空值數(shù)量


<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, a to c
Data columns (total 4 columns):
name 3 non-null object
sex 3 non-null object
age 3 non-null int64
city 3 non-null object
dtypes: int64(1), object(3)
memory usage: 120.0+ bytes


describe()輸出如下:

增刪行列

增加列,和字典操作一樣,可以通過直接在后面插入列的方式,另外還可以使用insert函數(shù)

insert(loc, column, value, allow_duplicates=False)

df[新增列名] = [內(nèi)容] #增加列,默認(rèn)插入到最后一列
#舉例
data = [1,1,2]
df.insert(0,"class",data) #loc為指定位置,這里為0,則插入開頭
class name sex age city
a 1 小蘭 24 Beijing
b 1 小民 20 Beijing
c 2 小紅 21 Tianjin

增加行

pd.DataFrame.append(other, ignore_index=False,
verify_integrity=False, sort=None)

#舉例
dict_1 = {"class":[2,2],
          "name": ["小新","小花"],
          "sex":["男","女"],
          "age":[19,22],
          "city":["Shanghai","Tianjin"]}
df_1 = pd.DataFrame(dict_1,list("ab"))
df_2 = df.append(df_1,ignore_index=True) #ignore_index為是否重新排序,True重新排序,F(xiàn)alse則為原本序號(hào)
class name sex age city
0 1 小蘭 24 Beijing
1 1 小民 20 Beijing
2 2 小紅 21 Tianjin
3 2 小新 19 Shanghai
4 2 小花 22 Tianjin

刪除行列
刪除列,可使用pop()以及del直接刪除,刪除行列則可以使用drop(),建議使用drop()而不是del,因?yàn)閐rop()不改變?cè)瓟?shù)據(jù),而是重新生成新的數(shù)據(jù),同樣的還有append()。

drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')#axis = 0表示行,1表示列,默認(rèn)為0

df.pop("age") #刪除并返回age列
del df["age"] #直接刪除age列

#舉例
df_2.drop(index=[1,2],columns= "city") #表示刪除1,2行以及city列
df_2.drop("city",axis=1) #刪除city列
df_2.drop([1,2]) #刪除1、2行
修改索引

如果需要修改數(shù)組的索引,可以使用rename()

rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)

#舉例
df_2.rename({0:"a",1:"b",2:"c",3:"d",4:"e"}) #直接修改,默認(rèn)修改index
df_2.index=["a","b","c","d","e"] #使用index或columns直接修改會(huì)改變?cè)瓟?shù)據(jù),rename()則不改變?cè)瓟?shù)據(jù)
df_2.rename(str.upper,axis="columns") #將列名改為大寫,axis默認(rèn)為"index"
df_2.rename(index= lambda x: x+2)  #修改行序號(hào)為
df_2.rename(columns={"age":"年齡"}) #修改age列為“年齡”

修改值,可以直接通過

索引和切片

通過索引方式直接選取列,可以使用方括號(hào)[ ],也可以直接引用列名。

df_2["age"]
df_2[["age","city"]] #選取多列
df_2.age

行的選取可以通過iloc,loc以及ix,loc是location(位置),iloc的i是integer(整數(shù)),從名字就可以看出兩者的區(qū)別。

df.iloc[1]
df.loc["b"]

兩者輸出均為一樣


class 1
name 小民
sex 男
age 20
city Beijing
Name: b, dtype: object


pandas同樣能夠進(jìn)行切片操作,還可以利用iloc方便進(jìn)行切片操作,可以參考numpy切片

df.iloc[1:3] #等同于df[1:3],df.loc[["b","c"]]
df_2.iloc[1:3]
df_2.loc[1:3]  #當(dāng)行索引為默認(rèn)數(shù)字時(shí)可使用loc,注意loc[1:3]為閉區(qū)間,取1,2,3行,區(qū)別df_2.iloc[1:3]

通過切片可以方便地批量修改特定位置值,如:
df_2[:4,3]=18
df_2.iloc[1]["age"] =20
可以試試下面的輸出的結(jié)果

df_2.iloc[:2,:3] 
df_2.iloc[2,3]
df_2.iloc[::2,::3]
df_2.iloc[::-1]
算術(shù)運(yùn)算

和numpy一樣,pandas也能對(duì)數(shù)組進(jìn)行運(yùn)算

add(other, axis='columns', level=None, fill_value=None)
類似add()的還有sub(),mul(),div()......分別為加減乘除。

sum(axis=None, skipna=None, level=None, numeric_only=None, min_count=0, **kwargs)
類似sum()的還有max(),min()

a = pd.DataFrame(np.arange(9).reshape(3,3))
b = pd.DataFrame(np.arange(16).reshape(4,4))
#輸入代碼查看結(jié)果
a+b #a.add(b)
a.div(b)
a.add(b, fill_value = 0)
a.add([5,5,6], axis="index")
a.sum()
a.sum(axis=1)
a.max()
查找缺失值

數(shù)據(jù)常常需要先處理缺失值,再進(jìn)行數(shù)據(jù)分析,這里用到fillna()或者replace()替換缺失值,dropna()去除缺失值。

fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')

dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

c = pd.DataFrame([[np.nan, 2, np.nan, 0],
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5],
                   [np.nan, 3, np.nan, 4]],
                  columns=list('ABCD'))
c.fillna(1) #替換空值為1
c.replace(np.nan,1) #同上
c.dropna(axis=1,how = "all") #刪除所有值為空值的列,how="any"為任意值為空值,
c.dropna(thresh = 2) #每行只有有2個(gè)非空值才保留
c.dropna(subset=["D","A"]) #刪除保留A、D列有空值的行
數(shù)組連接

數(shù)據(jù)的合并、連接需要用到merge、join、concat函數(shù),官方文檔
merge類似于sql的左右內(nèi)外連接,通過列鍵連接;
join通過行索引連接,以及將鍵轉(zhuǎn)為索引連接;后續(xù)會(huì)寫具體使用方法,這里就不詳細(xì)說明。

merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

how:連接方式, {‘left’, ‘right’, ‘outer’, ‘inner’},默認(rèn)inner
on, right_on, left_on :對(duì)應(yīng)的分別為連接鍵、右連接鍵、左連接鍵
sort:對(duì)連接鍵進(jìn)行排序

join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False, copy=True)

df_3 = pd.DataFrame({"name":["小蘭","小民","小民","小紅","小紅","小紅","小新"],
                    "course":["math","manth","physics","math","physics","English","math"],
                    "score":[80,90,89,98,76,85,92]})
df_2.merge(df_3,on="name")

輸出:


數(shù)組匯總

groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

df_3.groupby(["name"]).mean() #計(jì)算每人的平均分
數(shù)據(jù)透視

pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

pivt_table可以參考excel的數(shù)據(jù)透視表,values為透視的值,index為透視行,columns為透視列,aggfunc為值計(jì)算函數(shù),fill_value對(duì)nan值的填充

pd.pivot_table(df_3,values = "score", index="name",columns="course",fill_value=0)
增加計(jì)算列

需要去列進(jìn)行新增計(jì)算列時(shí),可以用assign函數(shù)

assign(**kwargs)
**kwargs為可調(diào)用的列

#所有學(xué)生分?jǐn)?shù)按80%計(jì)算
df_3.assign(score80 = lambda x: x.score*0.8) 
df_3.assign(score80 = df_3["score"]*0.8)

以上輸出一樣:


assign函數(shù)還能直接對(duì)新生成的列計(jì)算

df_3.assign(score80 = lambda x: x.score*0.8,score50 = lambda x: x["score80"]*0.5)

以上就是pandas的一些總結(jié)教程,后續(xù)介紹pandas在時(shí)間日期的應(yīng)用,pandas在日期時(shí)間處理上十分方便。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這兩行代碼輸出如下:pandas是一個(gè)Python語言的軟件包,在我們使用Python語言進(jìn)行機(jī)器學(xué)習(xí)編程的時(shí)候,...
    遺忘_eea2閱讀 1,735評(píng)論 0 1
  • 參考資料: Pandas 文檔 開始 安裝 pip install pandas使用前需導(dǎo)入模塊:import p...
    喔蕾喔蕾喔蕾蕾蕾閱讀 1,787評(píng)論 0 3
  • 在python中,眾所周知,數(shù)據(jù)預(yù)處理最好用的包就是pandas了,以下是pandas里的dataframe數(shù)據(jù)結(jié)...
    天涯海角醉云游閱讀 31,619評(píng)論 1 12
  • 每天要走一萬步,輕松減肥還能減壓,我估計(jì)很多人都知道運(yùn)動(dòng)有減壓的功效,而適當(dāng)?shù)倪\(yùn)動(dòng)不僅對(duì)于心血管有好處還對(duì)于該死的...
    fansi_0f0f閱讀 181評(píng)論 0 0
  • 讀書時(shí)代有過演講比賽的機(jī)會(huì),都確定我上臺(tái),怕自己演講的不好主動(dòng)放棄要求換人。工作以后有個(gè)關(guān)于演講的比賽,每...
    小米萬閱讀 181評(píng)論 2 1

友情鏈接更多精彩內(nèi)容