[Python與數(shù)學建模-數(shù)據(jù)處理與可視化]-3數(shù)據(jù)處理工具Pandas

??(Panel Data,面板數(shù)據(jù))是在Numpy的基礎(chǔ)上開發(fā)的,是Python最強大的數(shù)據(jù)分析和探索工具之一,作為金融數(shù)據(jù)分析工具而開發(fā),支持類似于SQL語句的模型,支持時間序列分析。該工具庫可以幫助數(shù)據(jù)分析師進行數(shù)據(jù)類型轉(zhuǎn)換、缺失值的處理、描述性統(tǒng)計分析、數(shù)據(jù)的匯總等。
&工具庫中包含的函數(shù),可以使用如下命令:

import pandas as pd
dir(pd)

??Pandas 中最重要的是Series和DataFrame子類,其導入方法如下:

from pandas import Series,DataFrame

??Pandas 可以進行統(tǒng)計特征計算,包括均值、方差、分位數(shù)、相關(guān)系數(shù)和協(xié)方差等,這些統(tǒng)計特征可以反應數(shù)據(jù)的整體分布。

mean():
std():
cov():
var():
describe():非NaN數(shù)據(jù)個數(shù)、均值、標準差、最小值、樣本25%、50%和75%分位數(shù),最大值

1.Pandas 的序列與數(shù)據(jù)框

??Pandas 數(shù)據(jù)結(jié)構(gòu)的范圍可以從一維到三維。Series(序列)是一維的,DataFrame(數(shù)據(jù)板)是二維的,Panel是三維甚至更高維的數(shù)據(jù)結(jié)構(gòu)。通常,Series和DataFrame可以用于大多數(shù)統(tǒng)計、工程、財務(wù)和社會科學的場景中。
??Series:它是一個帶標簽的一維數(shù)組,可以用于存儲任意類型數(shù)據(jù),例如整型、浮點型、字符串和其他有效的Python對象。它的行標簽成為index。
??DataFrame:它是一個帶標簽的二維數(shù)組,有行和列。列可以有多種類型。DataFrame可以看作二維結(jié)構(gòu)的數(shù)組,例如電子表格和數(shù)據(jù)庫表格。DataFrame也可以看作包含多個不同類型的Series的集合。
??Panel:在統(tǒng)計學和經(jīng)濟學中,Panel data(面板數(shù)據(jù))指多維數(shù)據(jù),這個多維數(shù)據(jù)包括不同時間的不同測量結(jié)果。該數(shù)據(jù)結(jié)構(gòu)的名稱來源于其概念。與Series和DataFrame相比,面板數(shù)據(jù)是不太常用的一種數(shù)據(jù)結(jié)構(gòu)。

1.1序列

??構(gòu)造一個序列可以如下方式實現(xiàn):

1-通過同類型列表或元組構(gòu)建
2-通過字典構(gòu)建
3-通過Numpy中的一維數(shù)組構(gòu)建
4-通過數(shù)據(jù)框中的某一列構(gòu)建

??例2.29 序列構(gòu)建示例

#例2.29 序列構(gòu)建示例
#程序文件Pex2_29.py
import pandas as pd
import numpy as np
s1 = pd.Series(np.array([10.5,20.5,30.5]))#由數(shù)組構(gòu)造序列
s2 = pd.Series({"北京":10.5,"上海":20.5,"廣東":30.5})#由字典構(gòu)造序列
s3 = pd.Series([10.5,20.5,30.5],index = ['b','c','d'])#給出行標簽命名
print(s1);
print("------------");
print(s2);
print("------------");
print(s3)
image.png

??通過以上顯示結(jié)果可以看出,序列由兩列構(gòu)成。由數(shù)組構(gòu)建的序列,其第一列是序列的行索引(行號),自動從0開始,第二列才是序列的實際值。通過字典構(gòu)造的序列,第一列是具體的行名稱(index),對應到字典中的鍵,第二列是序列的實際值,對應到字典中的值。
??序列與一維數(shù)組也有很高的相似性,獲取一維數(shù)組元素的所有方法都可以應用在序列上,而且數(shù)組的數(shù)學和統(tǒng)計函數(shù)也同樣可以應用到序列對象上,不同的是,序列會有更多其他處理方法。

#例2.30 序列構(gòu)建示例
#程序文件Pex2_30.py
import pandas as pd
import numpy as np
s = pd.Series([10.5,20.5,30.5],index = ['a','b','c'])
a = s['b']#取出序列中的第2個元素
b1 = np.mean(s)
b2 = s.mean()

數(shù)據(jù)框

??DataFrame是由行和列構(gòu)成的二維數(shù)據(jù)結(jié)構(gòu)。雖然索引和列名稱是可選的,但是最好把它們設(shè)置一下,索引可以看成是行標簽,列名稱可以看成是列標簽。
??數(shù)據(jù)框創(chuàng)建方式如下:
??DataFrame(data=二維數(shù)據(jù)[,index = 行索引[,columns = 列索引[,dtype = 數(shù)據(jù)類型]]])
??其中的data可以是二維Numpy數(shù)組,data如果是字典時,其值為一維數(shù)組,鍵為數(shù)據(jù)框的列名。

#例2.31 序列構(gòu)建示例
#程序文件Pex2_31.py
import pandas as pd
import numpy as np
a = np.arange(1,7).reshape(3,2)
df1 = pd.DataFrame(a)
df2 = pd.DataFrame(a,index = ['a','b','c'],columns = ['x1','x2'])
df3 = pd.DataFrame({'x1':a[:,0],'x2':a[:,1]})
print(df1);
print('-------')
print(df2);
print('-------')
print(df3);
image.png

2.外部文件的存取

??在實際應用中,更多的情況是通過Python讀取外部數(shù)據(jù),這些數(shù)據(jù)可能是文本文件(如csv、txt等類型)和電子表格Excel文件等。本小節(jié)實現(xiàn)基于Pandas庫實現(xiàn)文本文件和Excel文件的讀取。

\color{red}{2.1文本文件的讀取}

??Pandas 模塊中的read_csv函數(shù),可以讀取txt和csv(逗號分隔的文本文件)文本格式數(shù)據(jù)。
??read_csv的調(diào)用格式為:

read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)

??其中幾個重要參數(shù)如下:
??(1)filepath_or_buffer:可以是URL和文件,可用URL類型包括http,ftp等。
??(2)sep:如果不指定參數(shù),則會嘗試使用逗號分隔。
??(3)delimiter:定界符,備選分隔符(如果指定該參數(shù),則sep參數(shù)失效)。
??(4)header:header = None,指明原始數(shù)據(jù)文件沒有列標題,這樣read_csv會自動加上列標題。header = 0表示文件第一行為列標題(索引從0開始)。header參數(shù)可以是一個list,例如:[0,1,3],這個list表示將文件中的第1,2,4行作為列標題(意義著每一列多個標題),這些行將被忽略掉。
??(5)names:如果原數(shù)集中沒有字符,可以通過該參數(shù)在數(shù)據(jù)讀取時給數(shù)據(jù)添加具體的表頭。
??(6)index_col:用作行索引的列表號或列名,如果給定一個序列則有多個行索引。
??(7)skiprows:數(shù)據(jù)讀取時,假定需要跳過原數(shù)據(jù)集開頭的行數(shù)。
??(8)skipfooter:數(shù)據(jù)讀取時,指定需要通過原數(shù)據(jù)集末尾的行數(shù)。
??(9)nrows:指定讀取數(shù)據(jù)的行數(shù)。
??(10)na_values:指定原數(shù)集中哪些特征的值作為缺失值。
??(11)skip_blank_lines:讀取數(shù)據(jù)時是否需要通過原數(shù)據(jù)集中的空白行,默認為True.
??(12)parse_dates:如果參數(shù)值為True,則嘗試解析數(shù)據(jù)框的行索引;如果參數(shù)為列表,則嘗試解析對應的日期列;如果參數(shù)為嵌套列表,則將某些列合并為日期列;如果參數(shù)為字典,則解析對應的列(字典中的值),并生成新的字段名(字典中的鍵)。
??(13):指定原數(shù)據(jù)集中的千分位符。


image.png
#例2.32 序列構(gòu)建示例
#程序文件Pex2_32.py
import pandas as pd
a = pd.read_csv('Pdata2_32.txt',sep = ',',parse_dates = {'birthday':[0,1,2]},skiprows = 2,skipfooter = 2,comment = '#',thousands = '&',engine = 'python')
#parse_dates參數(shù)通過字典實現(xiàn)前三列的日期解析,并合并為新字段birthday
print(a)
b = pd.read_csv('Pdata2_32.txt',sep = ',',skiprows = 2,skipfooter = 2)
print('-----------------------')
print(b)
image.png

\color{red}{2.2Excel文件的讀取}

??read_excel()函數(shù)可以讀入Excel文件中的數(shù)據(jù),其常用調(diào)用格式為:

read_excel(io, sheet_name=0, header=0, names=None, index_col=None, parse_cols=None, usecols=None, dtype=None)

??其中:
??(1)io:Excel文件名
??(2)sheet_name:表單名或單序號


image.png
#例2.32 序列構(gòu)建示例
#程序文件Pex2_33.py
import pandas as pd
a = pd.read_excel('Pdata2_33.xlsx',usecols = range(1,4))#提取第2列到第4列的數(shù)據(jù)
b = a.values#提取其中的數(shù)據(jù)
c = a.describe()#對數(shù)據(jù)進行統(tǒng)計描述
print(a)
print('---------------------------')
print(b)
print('---------------------------')
print(c)
image.png
#例2.34 序列構(gòu)建示例
#程序文件Pex2_34.py
import pandas as pd
import numpy as np
a = pd.read_excel('Pdata2_33.xlsx',usecols = range(1,4))
b = a.values
#生成DataFrame類型數(shù)據(jù)
c = pd.DataFrame(b,index = np.arange(1,11),columns = ['用戶A','用戶B','用戶C'])
f = pd.ExcelWriter('Pdata2_34.xlsx')#創(chuàng)建文件對象
c.to_excel(f,'sheet1')
c.to_excel(f,'sheet2')
f.save()
image.png

\color{red}{2.3數(shù)據(jù)子集的獲取}

??有時數(shù)據(jù)讀入后并不是對整體數(shù)據(jù)進行分析,而是分析數(shù)據(jù)中的部分子集。在Pandas庫中實現(xiàn)數(shù)據(jù)子集的獲取可以使用iloc,loc兩種方法,這兩種方法既可以對數(shù)據(jù)進行篩選,也可以實現(xiàn)變量的篩選,它們的語法可以表示成

[rows_select,cols_select]

??iloc:只能通過行號和列號進行數(shù)據(jù)的篩選,該索引方式與數(shù)組的索引方式類似,都是從0開始,可以間隔取號,對于切片仍然無法取到上限。
??loc:可以指定具體的行標簽(行名稱)和列標簽(字段名),而且,還可以將row_select指定為具體的篩選條件。

#例2.35 序列構(gòu)建示例
#程序文件Pex2_35.py
import pandas as pd
import numpy as np
a = pd.read_excel('Pdata2_33.xlsx',usecols = range(1,4))
b1 = a.iloc[np.arange(6),[0,1,2]]#通過標號篩選數(shù)據(jù)
b2 = a.loc[np.arange(6),['用戶A','用戶B']]#通過標簽篩選數(shù)據(jù)
print(b1)
print('---------------------------------')
print(b2)
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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