[Python与数学建模-数据处理与可视化]-3数据处理工具Pandas

  (Panel Data,面板数据)是在Numpy的基础上开发的,是Python最强大的数据分析和探索工具之一,作为金融数据分析工具而开发,支持类似于SQL语句的模型,支持时间序列分析。该工具库可以帮助数据分析师进行数据类型转换、缺失值的处理、描述性统计分析、数据的汇总等。
&工具库中包含的函数,可以使用如下命令:

import pandas as pd
dir(pd)

  Pandas 中最重要的是Series和DataFrame子类,其导入方法如下:

from pandas import Series,DataFrame

  Pandas 可以进行统计特征计算,包括均值、方差、分位数、相关系数和协方差等,这些统计特征可以反应数据的整体分布。

mean():
std():
cov():
var():
describe():非NaN数据个数、均值、标准差、最小值、样本25%、50%和75%分位数,最大值

1.Pandas 的序列与数据框

  Pandas 数据结构的范围可以从一维到三维。Series(序列)是一维的,DataFrame(数据板)是二维的,Panel是三维甚至更高维的数据结构。通常,Series和DataFrame可以用于大多数统计、工程、财务和社会科学的场景中。
  Series:它是一个带标签的一维数组,可以用于存储任意类型数据,例如整型、浮点型、字符串和其他有效的Python对象。它的行标签成为index。
  DataFrame:它是一个带标签的二维数组,有行和列。列可以有多种类型。DataFrame可以看作二维结构的数组,例如电子表格和数据库表格。DataFrame也可以看作包含多个不同类型的Series的集合。
  Panel:在统计学和经济学中,Panel data(面板数据)指多维数据,这个多维数据包括不同时间的不同测量结果。该数据结构的名称来源于其概念。与Series和DataFrame相比,面板数据是不太常用的一种数据结构。

1.1序列

  构造一个序列可以如下方式实现:

1-通过同类型列表或元组构建
2-通过字典构建
3-通过Numpy中的一维数组构建
4-通过数据框中的某一列构建

  例2.29 序列构建示例

#例2.29 序列构建示例
#程序文件Pex2_29.py
import pandas as pd
import numpy as np
s1 = pd.Series(np.array([10.5,20.5,30.5]))#由数组构造序列
s2 = pd.Series({"北京":10.5,"上海":20.5,"广东":30.5})#由字典构造序列
s3 = pd.Series([10.5,20.5,30.5],index = ['b','c','d'])#给出行标签命名
print(s1);
print("------------");
print(s2);
print("------------");
print(s3)
image.png

  通过以上显示结果可以看出,序列由两列构成。由数组构建的序列,其第一列是序列的行索引(行号),自动从0开始,第二列才是序列的实际值。通过字典构造的序列,第一列是具体的行名称(index),对应到字典中的键,第二列是序列的实际值,对应到字典中的值。
  序列与一维数组也有很高的相似性,获取一维数组元素的所有方法都可以应用在序列上,而且数组的数学和统计函数也同样可以应用到序列对象上,不同的是,序列会有更多其他处理方法。

#例2.30 序列构建示例
#程序文件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()

数据框

  DataFrame是由行和列构成的二维数据结构。虽然索引和列名称是可选的,但是最好把它们设置一下,索引可以看成是行标签,列名称可以看成是列标签。
  数据框创建方式如下:
  DataFrame(data=二维数据[,index = 行索引[,columns = 列索引[,dtype = 数据类型]]])
  其中的data可以是二维Numpy数组,data如果是字典时,其值为一维数组,键为数据框的列名。

#例2.31 序列构建示例
#程序文件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读取外部数据,这些数据可能是文本文件(如csv、txt等类型)和电子表格Excel文件等。本小节实现基于Pandas库实现文本文件和Excel文件的读取。

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

  Pandas 模块中的read_csv函数,可以读取txt和csv(逗号分隔的文本文件)文本格式数据。
  read_csv的调用格式为:

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)

  其中几个重要参数如下:
  (1)filepath_or_buffer:可以是URL和文件,可用URL类型包括http,ftp等。
  (2)sep:如果不指定参数,则会尝试使用逗号分隔。
  (3)delimiter:定界符,备选分隔符(如果指定该参数,则sep参数失效)。
  (4)header:header = None,指明原始数据文件没有列标题,这样read_csv会自动加上列标题。header = 0表示文件第一行为列标题(索引从0开始)。header参数可以是一个list,例如:[0,1,3],这个list表示将文件中的第1,2,4行作为列标题(意义着每一列多个标题),这些行将被忽略掉。
  (5)names:如果原数集中没有字符,可以通过该参数在数据读取时给数据添加具体的表头。
  (6)index_col:用作行索引的列表号或列名,如果给定一个序列则有多个行索引。
  (7)skiprows:数据读取时,假定需要跳过原数据集开头的行数。
  (8)skipfooter:数据读取时,指定需要通过原数据集末尾的行数。
  (9)nrows:指定读取数据的行数。
  (10)na_values:指定原数集中哪些特征的值作为缺失值。
  (11)skip_blank_lines:读取数据时是否需要通过原数据集中的空白行,默认为True.
  (12)parse_dates:如果参数值为True,则尝试解析数据框的行索引;如果参数为列表,则尝试解析对应的日期列;如果参数为嵌套列表,则将某些列合并为日期列;如果参数为字典,则解析对应的列(字典中的值),并生成新的字段名(字典中的键)。
  (13):指定原数据集中的千分位符。


image.png
#例2.32 序列构建示例
#程序文件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参数通过字典实现前三列的日期解析,并合并为新字段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()函数可以读入Excel文件中的数据,其常用调用格式为:

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 序列构建示例
#程序文件Pex2_33.py
import pandas as pd
a = pd.read_excel('Pdata2_33.xlsx',usecols = range(1,4))#提取第2列到第4列的数据
b = a.values#提取其中的数据
c = a.describe()#对数据进行统计描述
print(a)
print('---------------------------')
print(b)
print('---------------------------')
print(c)
image.png
#例2.34 序列构建示例
#程序文件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类型数据
c = pd.DataFrame(b,index = np.arange(1,11),columns = ['用户A','用户B','用户C'])
f = pd.ExcelWriter('Pdata2_34.xlsx')#创建文件对象
c.to_excel(f,'sheet1')
c.to_excel(f,'sheet2')
f.save()
image.png

\color{red}{2.3数据子集的获取}

  有时数据读入后并不是对整体数据进行分析,而是分析数据中的部分子集。在Pandas库中实现数据子集的获取可以使用iloc,loc两种方法,这两种方法既可以对数据进行筛选,也可以实现变量的筛选,它们的语法可以表示成

[rows_select,cols_select]

  iloc:只能通过行号和列号进行数据的筛选,该索引方式与数组的索引方式类似,都是从0开始,可以间隔取号,对于切片仍然无法取到上限。
  loc:可以指定具体的行标签(行名称)和列标签(字段名),而且,还可以将row_select指定为具体的筛选条件。

#例2.35 序列构建示例
#程序文件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]]#通过标号筛选数据
b2 = a.loc[np.arange(6),['用户A','用户B']]#通过标签筛选数据
print(b1)
print('---------------------------------')
print(b2)
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342