1.1 Pandas基本介绍
Python Data Analysis Library
或 Pandas
是基于Numpy
的一种工具,该工具是为了解决数据分析任务而创建的。Pandas
纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas
提供了大量能使我们快速便捷地处理数据的函数和方法。
import numpy as np
import pandas as pd
pandas中有两种常用的基本结构:
- Series
- 一维数组,与
Numpy
中的一维array
类似。二者与Python基本的数据结构List
很相近。Series
能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series
中。
- 一维数组,与
- DataFrame
- 二维的表格型数据结构。很多功能与R语言中的data.frame类似。可以将
DataFrame
理解为Series的容器。以下的内容主要以DataFrame
为主。
- 二维的表格型数据结构。很多功能与R语言中的data.frame类似。可以将
1.2Pandas库的series类型
一维Series 可以用一维列表初始化:
s1 = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s1)
# 0 1.0
# 1 3.0
# 2 5.0
# 3 NaN
# 4 6.0
# 5 8.0
# dtype: float64
默认情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。
s2 = pd.Series([1, 3, 5, np.nan, 6, 8], index=['a', 'b', 'c', 'd', 'e', 'f'])
print(s2)
# a 1.0
# b 3.0
# c 5.0
# d NaN
# e 6.0
# f 8.0
# dtype: float64
索引一数据的行标签
print(s1.index)
# RangeIndex(start=0, stop=6, step=1)
print(s2.index)
# Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
值
print(s2.values)
# [ 1. 3. 5. nan 6. 8.] np.array格式
print(s2[0])
# 1.0
print(s2['a'])
# 1.0
切片操作,和numpy差不多
print(s1[2:5])
# c 5.0
# d NaN
# e 6.0
# dtype: float64
索引赋值:
s1.index.name = "索引"
print(s1)
# 索引
# a 1.0
# b 3.0
# c 5.0
# d NaN
# e 6.0
# f 8.0
# dtype: float64
s1.index = list('abcdef')
print(s1)
# a 1.0
# b 3.0
# c 5.0
# d NaN
# e 6.0
# f 8.0
# dtype: float64
这时候的切片不再是左闭右开,下面的写法和s1[0:3]
等价
print(s1['a':'c'])
# a 1.0
# b 3.0
# c 5.0
# dtype: float64
1.3Pandas库的DataFrame类型
DataFrame
则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:
data = pd.date_range('20190101', periods=6)
print(data)
# DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
# # '2019-01-05', '2019-01-06'],
# # dtype='datetime64[ns]', freq='D')
然后创建一个DataFrame
结构:
df = pd.DataFrame(np.random.randn(6, 4))
print(df)
# 0 1 2 3
# 0 1.021006 1.765719 1.776930 0.033001
# 1 0.078115 -0.784737 0.261904 0.853981
# 2 0.137149 -0.264794 -1.064713 -0.611104
# 3 1.691658 0.060301 -0.448528 -0.206958
# 4 -1.129160 -1.446600 0.387408 0.915638
# 5 1.553429 0.541750 1.135685 -0.314485
df = pd.DataFrame(np.random.randn(6, 4), index=data, columns=list('ABCD'))
print(df)
# A B C D
# 2019-01-01 -0.403110 -0.676936 -1.597137 -1.726338
# 2019-01-02 0.821402 1.227160 -0.369561 -2.206953
# 2019-01-03 -0.492121 0.882169 0.834621 -0.110336
# 2019-01-04 1.567487 -1.213019 0.337903 0.756485
# 2019-01-05 2.359838 -1.142287 -0.164322 -0.598946
# 2019-01-06 0.359499 2.503660 -0.989103 0.229999
默认情况下,如果不指定index
参数和columns
,那么他们的值将用从0开始的数字替代。
除了向DataFrame
中传入二维数组,我们也可以使用字典传入数据:
df2 = pd.DataFrame({'A': 1., 'B': pd.Timestamp('20190101'),
'C': pd.Series(1, index=list(range(4)), dtype=np.float),
'D': np.array([3]*4, dtype=np.int),
'E': pd.Categorical(['test', 'train', 'test', 'train']),
'F': 'abc'})
print(df2)
# A B C D E F
# 0 1.0 2019-01-01 1.0 3 test abc
# 1 1.0 2019-01-01 1.0 3 train abc
# 2 1.0 2019-01-01 1.0 3 test abc
# 3 1.0 2019-01-01 1.0 3 train abc
print(df2.dtypes)
# A float64
# B datetime64[ns]
# C float64
# D int32
# E category
# F object
# dtype: object
字典的每个key代表一列,其value可以是各种能够转化为Series的对象。
与Series 要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同:
查看数据
头尾数据
head
和tail
方法可以分别查看最前面几行和最后面几行的数据(默认为5):
print(df.head())
# A B C D
# 2019-01-01 -1.304602 2.043264 -2.365490 0.348898
# 2019-01-02 -0.332710 -0.836310 0.391643 -0.713681
# 2019-01-03 1.315738 -1.694673 1.071747 -0.496341
# 2019-01-04 0.043809 0.508175 -1.230306 -0.593911
# 2019-01-05 1.323222 -1.002346 1.038059 -0.171501
最后3行:
print(df.tail(3))
# A B C D
# 2019-01-04 1.523261 -0.263010 0.913391 0.912008
# 2019-01-05 -0.894510 0.993565 0.141227 0.056933
# 2019-01-06 0.844139 0.185704 -0.070343 1.446769
下标,列标,数据
下标使用index
属性查看:
print(df.index)
# DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
# '2019-01-05', '2019-01-06'],
# dtype='datetime64[ns]', freq='D')
列标使用columns
属性查看:
print(df.columns)
# Index(['A', 'B', 'C', 'D'], dtype='object')
数据值使用values
查看:
print(df.values)
# [[-0.58907961 -1.16911153 1.25560219 -0.49365279]
# [-3.51588889 -0.62920317 -0.53742163 -0.22376674]
# [ 0.70458103 0.17104868 -1.32613727 0.83896575]
# [-0.52785699 1.87123803 0.87222562 -0.35988083]
# [ 0.67600155 0.63398791 0.23750621 0.72273571]
# [-0.3841158 0.52155693 -0.36270402 -0.48221057]]
1.4 Pandas读取数据及数据操作
我们将以豆瓣的电影数据作为我们深入了解Pandas的一个示例。
本地数据
df = pd.read_excel('豆瓣电影数据.xlsx')
print(df.head())
名字 投票人数 类型 产地 上映时间 时长 年代 评分 \
# 0 肖申克的救赎 692795.0 剧情/犯罪 美国 1994-09-10 00:00:00 142 1994 9.6
# 1 控方证人 42995.0 剧情/悬疑/犯罪 美国 1957-12-17 00:00:00 116 1957 9.5
# 2 美丽人生 327855.0 剧情/喜剧/爱情 意大利 1997-12-20 00:00:00 116 1997 9.5
# 3 阿甘正传 580897.0 剧情/爱情 美国 1994-06-23 00:00:00 142 1994 9.4
# 4 霸王别姬 478523.0 剧情/爱情/同性 中国大陆 1993-01-01 00:00:00 171 1993 9.4
#
# 首映地点
# 0 多伦多电影节
# 1 美国
# 2 意大利
# 3 洛杉矶首映
# 4 香港
行操作
# 显示第一行,
print(df.iloc[0])
# 名字 肖申克的救赎
# 投票人数 692795
# 类型 剧情/犯罪
# 产地 美国
# 上映时间 1994-09-10 00:00:00
# 时长 142
# 年代 1994
# 评分 9.6
# 首映地点 多伦多电影节
# Name: 0, dtype: object
也可以进行切片显示0到4行,print(df.iloc[0:5])
也可以使用loc
,功能类似,但是在切片的时候不再是左闭右开,比如:
print(df.loc[0:5])
,表示第0行到第5行。
添加一行
# 添加一行
dit = {'名字': '复仇者联盟3', '投票人数': '12345',
'类型': '科幻', '产地': '美国', '上映时间': '2018-05-04',
'时长': '144', '年代': '2018', '评分': '8.5', '首映地点': '美国'}
s = pd.Series(dit)
s.name = 38738 #新的最后一行
print(s)
# 上映时间 2018-05-04
# 产地 美国
# 名字 复仇者联盟3
# 年代 2018
# 投票人数 12345
# 时长 144
# 类型 科幻
# 评分 8.5
# 首映地点 美国
# Name: 38738, dtype: object
df = df.append(s)
print(df.tail(1))
# 名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
# 38738 复仇者联盟3 12345 科幻 美国 2018-05-04 144 2018 8.5 美国
删除一行
df = df.drop([38738])
print(df.tail(1))
# 名字 投票人数 类型 产地 \
# 38737 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32 剧情/战争 苏联
#
# 上映时间 时长 年代 评分 首映地点
# 38737 1905-05-30 00:00:00 97 1977 6.6 美国
列操作
print(df.columns)
# Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')
print(df['名字'][:5])
# 0 肖申克的救赎
# 1 控方证人
# 2 美丽人生
# 3 阿甘正传
# 4 霸王别姬
print(df[['名字', '类型']][:5])
# 名字 类型
# 0 肖申克的救赎 剧情/犯罪
# 1 控方证人 剧情/悬疑/犯罪
# 2 美丽人生 剧情/喜剧/爱情
# 3 阿甘正传 剧情/爱情
# 4 霸王别姬 剧情/爱情/同性
增加一列
df['序号'] = range(1, len(df)+1)
print(df[:5])
# 名字 投票人数 类型 产地 上映时间 时长 年代 评分 \
# 0 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 00:00:00 142 1994 9.6
# 1 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 00:00:00 116 1957 9.5
# 2 美丽人生 327855 剧情/喜剧/爱情 意大利 1997-12-20 00:00:00 116 1997 9.5
# 3 阿甘正传 580897 剧情/爱情 美国 1994-06-23 00:00:00 142 1994 9.4
# 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 00:00:00 171 1993 9.4
#
# 首映地点 序号
# 0 多伦多电影节 1
# 1 美国 2
# 2 意大利 3
# 3 洛杉矶首映 4
# 4 香港 5
删除一列
df = df.drop('序号', axis=1)
网友评论