日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Python数据分析pandas之dataframe初识

發(fā)布時(shí)間:2024/9/27 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数据分析pandas之dataframe初识 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python數(shù)據(jù)分析pandas之dataframe初識(shí)

聲明與簡(jiǎn)介

pandas是一個(gè)基于python的、快速的、高效、靈活、易用的開源的數(shù)據(jù)處理、分析包(工具)。。pandas構(gòu)建在numpy之上,它通過(guò)DataFrame(數(shù)據(jù)框)來(lái)操作數(shù)據(jù)。數(shù)據(jù)框是一個(gè)高效的可以指定行和列標(biāo)簽的多維數(shù)組,通過(guò)這種數(shù)據(jù)類型可以更方便的操作、分析數(shù)據(jù)。本文主要介紹DataFrame的初始化和訪問(wèn)、缺失值處理的常見方法。

創(chuàng)建DataFrame

DataFrame可以看作是二維數(shù)組的模擬,可以通過(guò)行索引和列名對(duì)數(shù)組進(jìn)行檢索。數(shù)據(jù)框是二維的,由行和列組成,類似數(shù)據(jù)庫(kù)里的二維表的概念(眾多行和列組成)。

我們也可以把DataFrame看作是特殊的Numpy數(shù)組或者Python字典對(duì)象。

DataFrame(二維數(shù)組)是有一對(duì)排序有序的Series(一維數(shù)組)組成的,這里的有序指的是他們有相同的索引。

拼接字典方式的Series

#以學(xué)生學(xué)號(hào)、姓名、年齡的學(xué)生信息的DataFrame為例,演示DataFrame與Series的關(guān)系。 import pandas as pd age={"no_001":28,"no_002": 32,"no_003": 19}name={"no_001":"張三","no_002": "李四","no_003":"王二"}df= pd.DataFrame({"name":name,"age":age})print(df)#結(jié)果name age no_001 張三 28 no_002 李四 32 no_003 王二 19#這里不難發(fā)現(xiàn),Series name和Series age有相同的序列,即索引系統(tǒng)。這里可以理解為記錄序號(hào)或者學(xué)號(hào)。

二維Numpy數(shù)組

#通過(guò)Numpy數(shù)組的方式創(chuàng)建以學(xué)號(hào)為索引,含姓名和年齡的學(xué)生信息的數(shù)據(jù)框 import pandas as pd df=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) print(df)#結(jié)果name age no_001 張三 28 no_002 李四 32 no_003 王二 19

由結(jié)構(gòu)化(體)數(shù)組創(chuàng)建

#通過(guò)一個(gè)結(jié)構(gòu)體將分開的數(shù)組串成一個(gè)整體。這里的結(jié)構(gòu)體類似于C語(yǔ)言里的Struct,可以理解為一些有意義的個(gè)體內(nèi)容的整合。import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=age #打印結(jié)構(gòu)體的數(shù)據(jù)內(nèi)容 print(data) df=pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003']) print(df)#結(jié)果 [('張三', 28) ('李四', 32) ('王二', 19)]name age no_001 張三 28 no_002 李四 32 no_003 王二 19

訪問(wèn)DataFrame

字典方式

#該方式主要是指DataFrame是由字典形式的Series組成的,訪問(wèn)元素時(shí)可以采用字典方式。 #當(dāng)前需求是僅訪問(wèn)name列,即顯示所有人的姓名import pandas as pd age={"no_001":28,"no_002": 32,"no_003": 19}name={"no_001":"張三","no_002": "李四","no_003":"王二"}df= pd.DataFrame({"name":name,"age":age})print(df['name'],df.name) #結(jié)果 no_001 張三 no_002 李四 no_003 王二 Name: name, dtype: object no_001 張三 no_002 李四 no_003 王二 Name: name, dtype: object

二維Numpy數(shù)組

#通過(guò)Numpy數(shù)組的方式創(chuàng)建以學(xué)號(hào)為索引,含姓名和年齡的學(xué)生信息的數(shù)據(jù)框 import pandas as pd df=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) print(df.values)#結(jié)果 [['張三' 28]['李四' 32]['王二' 19]]

通過(guò)loc或iloc訪問(wèn)

#針對(duì)字典方式或二維數(shù)組方式創(chuàng)建的DataFrame都可通過(guò)loc和iloc方法進(jìn)行行和列的過(guò)濾來(lái)訪問(wèn)數(shù)據(jù)框里的元素。 #通過(guò)loc或者iloc訪問(wèn)數(shù)據(jù)框的內(nèi)容import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=agedf1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df1.loc['no_001']) print(df1.loc['no_001']['name']) print(df2.loc['no_001']['name']) print(df2.iloc[1])#結(jié)果 name 張三 age 28 Name: no_001, dtype: object 張三 張三 name 李四 age 32 Name: no_002, dtype: object

通過(guò)loc或iloc過(guò)濾

#針對(duì)字典方式或二維數(shù)組方式創(chuàng)建的DataFrame都可通過(guò)loc和iloc方法進(jìn)行行和列的過(guò)濾來(lái)訪問(wèn)數(shù)據(jù)框里的元素。 #通過(guò)loc或者iloc訪問(wèn)帶過(guò)濾條件的數(shù)據(jù)框內(nèi)容,這里僅顯示年齡大于30的學(xué)生姓名。import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=agedf1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df1.loc[data['age']>30,['name']]) #如果第2行里age大于30那么就顯示它的姓名 print(df1.name[df1.iloc[1]['age'] > 30])#結(jié)果name no_002 李四 李四

通過(guò)loc或iloc切片

#可以通過(guò)loc或者iloc對(duì)數(shù)據(jù)框進(jìn)行切片式訪問(wèn)。 #行切示例,分別以loc或iloc方式僅取出no_002、no_003對(duì)應(yīng)的內(nèi)容import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=age df1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df1.loc['no_002':'no_003']) print(df2.iloc[0:1])#結(jié)果name age no_002 李四 32 no_003 王二 19name age no_001 張三 28

DataFrame處理缺失值

None填充缺失值

該方式用None來(lái)補(bǔ)充缺失值,因?yàn)镹one是空對(duì)象,而Numpy、Series、DataFrame都屬于Padans且繼承自O(shè)bject對(duì)象,所以可以被賦值為None,即空對(duì)象。

#利用None作為空元素填充到數(shù)據(jù)框里。 import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], [None, 19]], columns=['name', 'age',],index=['no_001', 'no_002', 'no_003']) print(df2) #結(jié)果name age no_001 張三 28 no_002 李四 32 no_003 None 19 #注:None不可以參與任何的元素運(yùn)算,比如None+3是非法的。

NaN填充缺失的數(shù)值

#通過(guò)numpy的NAN方法對(duì)缺失、空的數(shù)值型進(jìn)行填充。 import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df2) print(df2['age'].sum()) #結(jié)果name age no_001 張三 28.0 no_002 李四 32.0 no_003 王二 NaN 60.0#1這里的np.nan是float類型。 #2由此可見DataFrame做列的sum時(shí)會(huì)將NaN值認(rèn)為是0.0。#這里的NAN可以做運(yùn)算,比如NaN+3還是NaN。示例如下: import numpy as np vals2 = np.array([1,3, 4,np.nan]) print(vals2.sum()) #結(jié)果 nan

Null notnull判斷空值

#1 通過(guò)isnull來(lái)判斷數(shù)據(jù)框里的列是否有None或者nan的情況 import pandas as pd df2 = pd.DataFrame([["張三", None], ["李四",32 ], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df2.isnull()) #結(jié)果name??? age no_001? False?? True no_002? False? False no_003? False?? True #2 同理利用notnull,提取age列不為空的數(shù)據(jù)。 import pandas as pd df2 = pd.DataFrame([["張三", None], ["李四",32 ], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df2[df2['age'].notnull()]) #結(jié)果name?? age no_002?? 李四? 32.0

用所在列前值填充空數(shù)據(jù)

#此種方式是用ffill方法即當(dāng)前列里為空元素的前一個(gè)元素來(lái)補(bǔ)充當(dāng)前為空的元素。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.fillna(method='ffill')) #結(jié)果,不難發(fā)現(xiàn)no_002的name被no_001的name填充,同理no_003的age被no_002的填充。name age score level no_001 張三 28.0 80 1 no_002 張三 32.0 90 2 no_003 王二 32.0 99 1

用所在列后值填充空數(shù)據(jù)

#此種方式是用bfill方法即當(dāng)前列里為空元素的前一個(gè)元素來(lái)補(bǔ)充當(dāng)前為空的元素。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.fillna(method='bfill')) #結(jié)果,不難發(fā)現(xiàn)這里no_002的name被no_003的name填充,而因?yàn)閚o_003是最后的記錄,所以無(wú)法再被填充,所以age只能還是NaN。name age score level no_001 張三 28.0 80 1 no_002 王二 32.0 90 2 no_003 王二 NaN 99 1

用固定值填充空數(shù)據(jù)

#此種方式即fillna時(shí)指定固定的值,比如0或者列的均值等。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.fillna(0)) #結(jié)果name age score level no_001 張三 28.0 80 1 no_002 0 32.0 90 2 no_003 王二 0.0 99 1

以列方向刪除空值

#這種方式從列這個(gè)角度(axis='columns')去刪除為None或者Nan的數(shù)據(jù),但凡某一列含有空就刪除該列,輸出列數(shù)取決于不含空的列的個(gè)數(shù)。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80], [None,32,90 ], ["王二",np.nan,99]], columns=['name', 'age','score' ],index=['no_001', 'no_002', 'no_003']) print(df2.dropna(axis='columns')) #結(jié)果score no_001 80 no_002 90 no_003 99 #注:axis='columns'等價(jià)于axis=1

以行方向刪除空值

#這種方式從行這個(gè)角度(axis='rows')去刪除為None或者Nan的數(shù)據(jù),但凡某一行含有空就刪除該行,輸出列數(shù)與原數(shù)據(jù)的列數(shù)一致或者為空。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80], [None,32,90 ], ["王二",np.nan,99]], columns=['name', 'age','score' ],index=['no_001', 'no_002', 'no_003']) print(df2.dropna()) print(df2.dropna(axis='rows')) #結(jié)果name age score no_001 張三 28.0 80 #注 1注:axis='rows'等價(jià)于axis=0 #2如果不指定axis那么就會(huì)從行、列方向做刪除操作。

以最小非空閥值刪除空值

#該方式是指定thresh參數(shù)以限定行或者列的最小非空的個(gè)數(shù),即最小非空閾值。 #當(dāng)前示例有姓名、年齡、分?jǐn)?shù)、等級(jí)4列,3條數(shù)據(jù),這里因?yàn)樵O(shè)置了最小非空閾值,所以輸出結(jié)果里有的列是None或者Nan是正常的。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.dropna()) print(df2.dropna(axis='rows',thresh=3)) #結(jié)果 name age score level no_001 張三 28.0 80 1 no_002 None 32.0 90 2 no_003 王二 NaN 99 1

總結(jié)

以上是生活随笔為你收集整理的Python数据分析pandas之dataframe初识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。