赞
踩
目录
Pandas模块的核心操作对象就是序列(series)和数据框(DataFrame)。序列可以理解为数据集中的一个字段,数据库是指含有至少两个字段(或序列)的数据集。
构造序列的方式:
- #导入模块
- import pandas as pd
- import numpy as np
-
- #构造序列
- gdp1=pd.Series([2.8,3.01,8.99,8.59,5.18])
- gdp2=pd.Series({'北京':2.8,'上海':3.01,'江苏':8.59})
- gdp3 = pd.Series(np.array((2.8,3.01,8.99,8.59,5.18)))
- print(gdp1)
- print(gdp2)
- print(gdp3)
-
- out:
- 0 2.80
- 1 3.01
- 2 8.99
- 3 8.59
- 4 5.18
- dtype: float64
- 北京 2.80
- 上海 3.01
- 江苏 8.59
- dtype: float64
- 0 2.80
- 1 3.01
- 2 8.99
- 3 8.59
- 4 5.18
- dtype: float64

Series构造的序列结果会产生两列,第一列属于序列的行索引(可以理解为行号),自动从0开始,第二例是序列的实际的值。通过字典构造,第一列是行名称,对应字典的键,第二列是序列的实际值,对应字典的值。
序列与一维数组有极高相似性,获取一维数组的索引方法可以应用在序列上,而且数组的数学和统计函数也可以用在序列对象上,不过序列有更多的其他处理方法
- # 数学函数--取对数
- print('通过numpy函数:\n',np.log(gdp1))
- # 平均gdp
- print('通过numpy函数:\n',np.mean(gdp1))
- print('通过序列的方法:\n',gdp1.mean())
-
- out:
- 通过numpy函数:
- 0 1.029619
- 1 1.101940
- 2 2.196113
- 3 2.150599
- 4 1.644805
- dtype: float64
- 通过numpy函数:
- 5.714
- 通过序列的方法:
- 5.714

数据框实质就是一个数据集,数据集的行代表每一条观测,数据集的列代表各个变量。在一个数据框中可以存放不同数据类型的序列,如整数型、浮点型、字符型和日期时间型,而数组和序列没有这样的优势,因为他们只能存放同质数据。构造一个数据库应用如下方式:
- # 构造数据框
- df1 = pd.DataFrame([['张三',23,'男'],['李四',27,'女'],['王二',26,'女']])
- df2 = pd.DataFrame({'姓名':['张三','李四','王二'],'年龄':[23,27,26],'性别':['男','女','女']})
- df3 = pd.DataFrame(np.array([['张三',23,'男'],['李四',27,'女'],['王二',26,'女']]))
- print('嵌套列表构造数据框:\n',df1)
- print('字典构造数据框:\n',df2)
- print('二维数组构造数据框:\n',df3)
-
- out:
- 嵌套列表构造数据框:
- 0 1 2
- 0 张三 23 男
- 1 李四 27 女
- 2 王二 26 女
- 字典构造数据框:
- 姓名 年龄 性别
- 0 张三 23 男
- 1 李四 27 女
- 2 王二 26 女
- 二维数组构造数据框:
- 0 1 2
- 0 张三 23 男
- 1 李四 27 女
- 2 王二 26 女

构造数据框需要使用pandas模块中的DataFrame。将嵌套列表、元组或二维数组转换为数据框是,数据框无具体变量名,只有从0到n的列号。所以,如果需要手工构造数据框时,一般首选字典方法。
如果读取txt或csv格式的数据,可以使用pandas模块中的read_table函数或者read_csv函数。这两个函数均可以读取文本文件的数据。
pd.read_table(filepath_or_buffer,sep='t',header='infer',names=None,index_col=None,usecols=None,dtype=None,converters=None,skiprows=None,skipfooter=None,nrows=None,na_values=None,skip_blank_lines=True,parse_dates=False,thousands=None,comment=None,encoding=None)
filepath_or_buffer,指定文件路径;
sep,分隔符、默认Tab制表符;
header,是否第一行做表头,默认是;
names,原数据集中无字段,可以通过该参数在数据读取时给数据框添加具体的表头;
index_col,指定原数据集中的某些列作为数据框的行索引(标签);
usecols,指定需要读取数据集中的哪些变量名;
dtype,读取数据时,可以为原数据集的每个字段设置不同的数据类型
converters,通过字典格式,为数据集中的某些字段设置转换函数
skiprows,数据读取时,指定需要跳过原数据集开头的行数
skipfooter,数据读取时,指定需要跳过原数据集末尾的行数
nrows,指定读取数据的行数
na_values,指定哪些特征的值为缺失值
skip_blank_lines=True,读取数据时是否需要跳过原数据集中的空白行,默认True
parse_dates=False,如果参数值为True,则尝试解析数据框的行索引;如果参数值为列表,则分析对应的日期列;如果参数值为嵌套列表,则将某些列合并为日期列;如果参数为字典,则对应列(字典中的值),并生成新的字段名(字典中的键)
thousands=None,指定原始数据集的千分位符;
comment=None,指定注释符,在读取数据时,如果碰到行首指定的注释符,则跳过该行
encoding=None如果文件中含有中文,有时候需要指定字符编码
- # 读取文本文件中的数据
- user_income = pd.read_table(r'''C:\Users\yu'chuan'zhao\Desktop\pythondatacourse\第5章 Python数据处理工具--Pandas\data_test01.txt''', sep = ',',
- parse_dates={'birthday':[0,1,2]},skiprows=2, skipfooter=3,
- comment='#', encoding='utf8', thousands='&')
- user_income
-
- out:
- birthday gender occupation income
- 0 1990-03-07 男 销售经理 6000
- 1 1989-08-10 女 化妆师 8500
- 2 1992-10-07 女 前端设计 6500
- 3 1985-06-15 男 数据分析师 18000
运用read_execl函数,读取电子表格数据。
pd.read_excel(io,sheetname=0,header=0,skip_footer=0,index_col=None,names=None,parse_cols=None,parse_dates=False,na_values=None,thousands=None,convert_float=True)
io,电子表格具体路径
sheetname=0,指定需要读取电子表格中的第几个sheet,既可以传递整数
header=0,是否需要将数据集的第一行用做表头,默认为是需要的
skip_footer=0,读取数据时,指定跳过的开始行数
index_col=None,指定哪些列用作数据框的行索引
names=None,如果原数据集中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头
parse_cols=None,指定需要解析的字段
parse_dates=False,如果参数值为True,则尝试解析数据框的行索引;如果参数值为列表,则分析对应的日期列;如果参数值为嵌套列表,则将某些列合并为日期列;如果参数为字典,则对应列(字典中的值),并生成新的字段名(字典中的键
na_values=None,指定原始数据集中的千分位符
thousands=None,指定原始数据集中的千分位符
convert_float=True 默认将所有的数值型字段转换为浮点型字段
converters 通过字典的形式,指定某些列需要转换的形式。
- child_cloth = pd.read_excel(io = r'''C:\Users\yu'chuan'zhao\Desktop\pythondatacourse\第5章 Python数据处理工具--Pandas\data_test02.xlsx''', header = None,
- names = ['Prod_Id','Prod_Name','Prod_Color','Prod_Price'], converters = {0:str})
- child_cloth
-
- out:
- Prod_Id Prod_Name Prod_Color Prod_Price
- 0 00101 儿童裤 黑色 109
- 1 01123 儿童上衣 红色 229
- 2 01010 儿童鞋 蓝色 199
- 3 00100 儿童内衣 灰色 159
重点说明converters参数,通过该参数可以指定某些变量需要转换的函数。很显然,原始数据集中的商品ID是字符型的,如果不将该参数设置为{0:str},读入的数据与原始的数据集就不一致了。
在我们读取了数据之后,如何了解数据,比如数据的规模、变量所属的数据类型,一些重要指标等,如何查找
- #数据读取
- sec_cars=pd.read_table(r'''C:\Users\yu'chuan'zhao\Desktop\pythondatacourse\第5章 Python数据处理工具--Pandas\sec_cars.csv''',sep=',')
- #预览数据的前五行
- sec_cars.head()
-
- out:
- Brand Name ... Sec_price New_price
- 0 众泰 众泰T600 2016款 1.5T 手动 豪华型 ... 6.8 9.42万
- 1 众泰 众泰Z700 2016款 1.8T 手动 典雅型 ... 8.8 11.92万
- 2 众泰 大迈X5 2015款 1.5T 手动 豪华型 ... 5.8 8.56万
- 3 众泰 众泰T600 2017款 1.5T 手动 精英贺岁版 ... 6.2 8.66万
- 4 众泰 众泰T600 2016款 1.5T 手动 旗舰型 ... 7.0 11.59万
如果只需要预览数据的几行信息,可以使用head方法和tail方法。数据集前五行head,数据集后五行tail。
如果还想知道数据集中有多少观测和多少变量,以及每个变量都是什么类型,可由如下代码得知:
- #查看数据的行列数
- print('数据集的行列数: \n',sec_cars.shape)
- #查看数据集的每个变量的数据类型
- print('各变量的数据类型:\n',sec_cars.dtypes)
-
- out:
- 数据集的行列数:
- (10984, 7)
- 各变量的数据类型:
- Brand object
- Name object
- Boarding_time object
- Km(W) float64
- Discharge object
- Sec_price float64
- New_price object
- dtype: object

Boarding_time应该为日期型,新车价格New_price 应该为浮点型,为了后面的数据分析,需要对这两个变量进行类型的转换,具体操作如下:
- # 修改二手车上牌时间的数据类型
- sec_cars.Boarding_time = pd.to_datetime(sec_cars.Boarding_time, format = '%Y年%m月')
- # 修改二手车新车价格的数据类型
- sec_cars.New_price = sec_cars.New_price.str[:-1].astype('float')
- # 重新查看各变量数据类型
- sec_cars.dtypes
-
- out:
- Brand object
- Name object
- Boarding_time datetime64[ns]
- Km(W) float64
- Discharge object
- Sec_price float64
- New_price float64
- dtype: object

pandas模块中的to_datetime函数可以通过format参数灵活地将各种格式的字符型日期转换成真正的日期数据;由于二手新车价格含有“万”字,因此不能直接转换数据类型,为达到目的,首先字段转换成字符串,然后切片将“万”字剔除,最后运用astype方法,实现数据类型的转换。
需要对数据做到心中有数,通过基本的统计量(最小值、均值、中位数、最大值等)描述出数据的特征。数据的描述性分析可以使用describe方法。
- #数据的描述性统计
- sec_cars.describe()
-
- Out:
- Km(W) Sec_price New_price
- count 10984.000000 10984.000000 10984.000000
- mean 6.266357 25.652192 51.326006
- std 3.480678 52.770268 79.682066
- min 0.020000 0.650000 2.910000
- 25% 4.000000 5.200000 16.050000
- 50% 6.000000 10.200000 26.690000
- 75% 8.200000 23.800000 52.210000
- max 34.600000 808.000000 976.920000
一次性统计数值型变量的偏度和峰度
- # 数据的形状特征
- # 挑出所有数值型变量
- num_variables = sec_cars.columns[sec_cars.dtypes !='object'][1:]
- # 自定义函数,计算偏度和峰度
- def skew_kurt(x):
- skewness = x.skew()
- kurtsis = x.kurt()
- # 返回偏度值和峰度值
- return pd.Series([skewness,kurtsis], index = ['Skew','Kurt'])
- # 运用apply方法
- sec_cars[num_variables].apply(func = skew_kurt, axis = 0)
-
- out:
- Km(W) Sec_price New_price
- Skew 0.829915 6.313738 4.996912
- Kurt 2.406258 55.381915 33.519911

对离散型变量的统计描述仍然可以使用describe方法,所不同的是,需要设置该方法的include参数,具体如下
- # 离散型变量的统计描述
- sec_cars.describe(include = ['object'])
四个统计值分别是 非缺失观测数、唯一水平数、频次最高的离散值和具体的频次。
以下图为例,完成字符串和日期数据的处理
- # 数据读入
- df = pd.read_excel(r'C:\Users\Administrator\Desktop\data_test03.xlsx')
- # 各变量数据类型
- print(df.dtypes)
- # 将birthday变量转换为日期型
- df.birthday = pd.to_datetime(df.birthday, format = '%Y/%m/%d')
- # 将手机号转换为字符串
- df.tel = df.tel.astype('str')
- # 新增年龄和工龄两列
- df['age'] = pd.datetime.today().year - df.birthday.dt.year
- df['workage'] = pd.datetime.today().year - df.start_work.dt.year
- # 将手机号中间四位隐藏起来
- df.tel = df.tel.apply(func = lambda x : x.replace(x[3:7], '****'))
- # 取出邮箱的域名
- df['email_domain'] = df.email.apply(func = lambda x : x.split('@')[1])
- # 取出用户的专业信息
- df['profession'] = df.other.str.findall('专业:(.*?),')
- # 去除birthday、start_work和other变量
- df.drop(['birthday','start_work','other'], axis = 1, inplace = True)
- df.head()
-
- out:
- name gender income tel ... age workage email_domain profession
- 0 赵一 男 15000 136****1234 ... 33 10 qq.com [电子商务]
- 1 王二 男 12500 135****2234 ... 32 8 163.com [汽修]
- 2 张三 女 18500 135****3330 ... 35 13 qq.com [数学]
- 3 李四 女 13000 139****3388 ... 31 8 gmail.com [统计学]
- 4 刘五 女 8500 178****7890 ... 30 8 qq.com [美术]

pandas模块中的to_datetime函数将birthday转换为日期型(必须按照原始的birthday格式设置format参数);使用astype方法将tel转换为字符型。
在使用year方法之前,需要使用dt方法,否则会出错。
方法 | 含义 | 方法 | 含义 |
year | 返回年份 | month | 返回月份 |
day | 返回月份的日 | hour | 返回时 |
minute | 返回分钟 | second | 返回秒 |
date | 返回日期 | time | 返回时间 |
dayofyear | 返回年中第几天 | weekofyear | 返回年中第几周 |
dayofweek | 返回周几 | weekday_name | 返回具体的周几名称 |
quarter | 返回第几季度 | days_in_month | 返回月中第几天 |
- # 常用日期处理方法
- dates = pd.to_datetime(pd.Series(['1989-8-18 13:14:55','1995-2-16']), format = '%Y-%m-%d %H:%M:%S')
- print('返回日期值:\n',dates.dt.date)
- print('返回季度:\n',dates.dt.quarter)
- print('返回几点钟:\n',dates.dt.hour)
- print('返回年中的天:\n',dates.dt.dayofyear)
- print('返回年中的周:\n',dates.dt.weekofyear)
- print('返回星期几的名称:\n',dates.dt.day_name)
- print('返回月份的天数:\n',dates.dt.days_in_month)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。