数据分析之Pandas
Posted Maverick_曲流觞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析之Pandas相关的知识,希望对你有一定的参考价值。
3.Pandas
文章目录
3.1 Pandas基本介绍
Python Data Analysis Library或pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具。pandas提供了大量能使我们快速便捷的处理数据的函数和方法。
import pandas as pd
import numpy as np
3.1.1 Pandas的基本数据结构
pandas中有两种常用的基本结构
•Series
一维数组,与Numpy中的一维array类似,二者与Python基本的数据结构List也很相似。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series种。
•DataFrame
二维的表格型数据结构,很多功能与R种的data.frame类似。可以将DataFrame理解为Series的容器。
3.1.1.1 Pandas库的Series类型
一维Series可以用一维列表初始化
a=pd.Series([1,3,5,np.nan,6,5]) ##此处Series的S必须大写
print(a)
结果
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 5.0
dtype: float64
默认的情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。
b=pd.Series([1,3,5,np.nan,6,5],index=['a','b','c','d','e','f'])
print(b)
结果
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 5.0
dtype: float64
索引——数据行标签
查看索引
a.index
结果
RangeIndex(start=0, stop=6, step=1)
-----------------------------------------------
b.index
结果
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
查看取值
a.values
结果
array([ 1., 3., 5., nan, 6., 5.])
------------------------------
a[0]
结果
1.0
切片
a[2:5]
结果
2 5.0
3 NaN
4 6.0
dtype: float64
b['b':'f':2] ## 经过多次实践发现自定义索引的确是包头包尾
结果
b 3.0
d NaN
f 5.0
dtype: float64
索引赋值
a.index.name='索引'
a
结果
索引
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 5.0
dtype: float64
和Series里面赋值一样
a.index=list('abcdef')
a
结果
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 5.0
dtype: float64
3.1.1.2 Pandas库的DataFrame类型
DataFrame初始化
DataFrame是个二维结构,这里首先构造一组时间序列,作为第一维的下标
date=pd.date_range('20230312',periods=6)
print(date)
结果
DatetimeIndex(['2023-03-12', '2023-03-13', '2023-03-14', '2023-03-15',
'2023-03-16', '2023-03-17'],
dtype='datetime64[ns]', freq='D')
然后创建一个DataFream结构
df=pd.DataFrame(np.random.randn(6,4))
df ##默认使用0、1、2.。。作为索引index
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | -1.490125 | 1.298987 | -0.543361 | 1.221980 |
1 | -0.849709 | 0.118608 | -0.955715 | 0.144980 |
2 | -0.599598 | -0.756037 | -1.795249 | -0.282495 |
3 | -0.332586 | 1.750622 | -1.493345 | -2.100013 |
4 | -0.905893 | -0.254791 | -1.476728 | -0.001651 |
5 | -1.121065 | -1.861881 | -0.502420 | 0.523135 |
df=pd.DataFrame(np.random.randn(6,4),index=date,columns=list('ABCD'))
df ##index参数设置行索引,columns参数设置列索引,默认情况下不指定index和columns,他们的值从0开始
A | B | C | D | |
---|---|---|---|---|
2023-03-12 | 0.443978 | -0.568280 | 0.539422 | -1.808815 |
2023-03-13 | -0.941946 | 1.600655 | -0.165418 | -0.143333 |
2023-03-14 | 0.058186 | 1.299691 | -0.722582 | -0.258170 |
2023-03-15 | 0.912441 | -1.347266 | -0.827097 | -1.189625 |
2023-03-16 | 0.427125 | 0.010411 | -0.390411 | 1.172277 |
2023-03-17 | -0.584286 | -0.428119 | 0.536305 | 1.327480 |
除了向DataFrame中传入二维数组,我们也可以使用字典传入数据
df1=pd.DataFrame('A':1,'B':pd.Timestamp('20230312'),'C':pd.Series(1,index=list(range(4)),dtype=float),'D':np.array([3]*4,dtype=int),'E':pd.Categorical(['test','train','test','train']),'F':'abc')
df1
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 1 | 2023-03-12 | 1.0 | 3 | test | abc |
1 | 1 | 2023-03-12 | 1.0 | 3 | train | abc |
2 | 1 | 2023-03-12 | 1.0 | 3 | test | abc |
3 | 1 | 2023-03-12 | 1.0 | 3 | train | abc |
字典的每个key代表一列,其value可以是各种能够转化为Series的对象
与Series要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同
df1.dtypes
结果
A int64
B datetime64[ns]
C float64
D int32
E category
F object
dtype: object
DataFrame查看数据
头尾数据
head和tail方法可以分别查看最前面几行和最后面几行的数据(默认为5)
df.head()
A | B | C | D | |
---|---|---|---|---|
2023-03-12 | 0.443978 | -0.568280 | 0.539422 | -1.808815 |
2023-03-13 | -0.941946 | 1.600655 | -0.165418 | -0.143333 |
2023-03-14 | 0.058186 | 1.299691 | -0.722582 | -0.258170 |
2023-03-15 | 0.912441 | -1.347266 | -0.827097 | -1.189625 |
2023-03-16 | 0.427125 | 0.010411 | -0.390411 | 1.172277 |
df.tail(3) ##后三行
A | B | C | D | |
---|---|---|---|---|
2023-03-15 | 0.912441 | -1.347266 | -0.827097 | -1.189625 |
2023-03-16 | 0.427125 | 0.010411 | -0.390411 | 1.172277 |
2023-03-17 | -0.584286 | -0.428119 | 0.536305 | 1.327480 |
下标、列标、数据 | ||||
下标使用index属性查看 |
df.index
结果
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06'],
dtype='datetime64[ns]', freq='D')
列标使用columns属性查看
df.columns
结果
Index(['A', 'B', 'C', 'D'], dtype='object')
数据值使用values查看
df.values
结果
array([[ 0.44397794, -0.56828038, 0.53942245, -1.8088147 ],
[-0.94194603, 1.60065473, -0.16541752, -0.14333282],
[ 0.05818642, 1.2996908 , -0.72258188, -0.25816996],
[ 0.91244089, -1.34726583, -0.82709665, -1.18962492],
[ 0.42712501, 0.01041125, -0.39041139, 1.17227685],
[-0.58428589, -0.42811927, 0.53630517, 1.32747977]])
3.1.2 Pandas读取数据及数据操作
以豆瓣的电影数据作为我们深入了解Pandas的示例
豆瓣电影数据(提取码:7tvl)
df_mv=pd.read_excel(.....) ## 括号中填写数据存放的位置
df_mv=pd.read_excel('豆瓣电影数据.xlsx') ## 直接填文件名,需要文件在当前目录下
df_mv=pd.read_excel(r'E:\\数据分析与挖掘\\date\\豆瓣电影数据.xlsx') ## 这种情况需要在地址前加r,以便转义失效
df_mv.head()
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
行操作
df_mv.iloc[0]
结果
Unnamed: 0 0
名字 肖申克的救赎
投票人数 692795
类型 剧情/犯罪
产地 美国
上映时间 1994-09-10 00:00:00
时长 142
年代 1994
评分 9.6
首映地点 多伦多电影节
Name: 0, dtype: object
df_mv.iloc[0:5] ## 左闭右开
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
也可以使用 loc
df_mv.loc[0:5] ## 两边都包
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 1 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 2 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 3 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 4 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
5 | 5 | 泰坦尼克号 | 157074.0 | 剧情/爱情/灾难 | 美国 | 2012-04-10 00:00:00 | 194 | 2012 | 9.4 | 中国大陆 |
添加一行
dit='名字':'复仇者联盟3',
'投票人数':123456,
'类型':'剧情/科幻',
'产地':'美国',
'上映时间':'2017-05-04 00:00:00',
'时长':142,
'年代':2017,
'评分':8.7,
'首映地点':'美国'
s=pd.Series(dit)
s.name=38738
s
名字 复仇者联盟3
投票人数 123456
类型 剧情/科幻
产地 美国
上映时间 2017-05-04 00:00:00
时长 142
年代 2017
评分 8.7
首映地点 美国
Name: 38738, dtype: object
df_mv=df_mv.append(s)
df_mv.tail()
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|---|
38734 | 38734.0 | 1935年 | 57.0 | 喜剧/歌舞 | 美国 | 1935-03-15 00:00:00 | 98 | 1935 | 7.6 | 美国 |
38735 | 38735.0 | 血溅画屏 | 95.0 | 剧情/悬疑/犯罪/武侠/古装 | 中国大陆 | 1905-06-08 00:00:00 | 91 | 1986 | 7.1 | 美国 |
38736 | 38736.0 | 魔窟中的幻想 | 51.0 | 惊悚/恐怖/儿童 | 中国大陆 | 1905-06-08 00:00:00 | 78 | 1986 | 8.0 | 美国 |
38737 | 38737.0 | 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме… | 32.0 | 剧情/战争 | 苏联 | 1905-05-30 00:00:00 | 97 | 1977 | 6.6 | 美国 |
38738 | NaN | 复仇者联盟3 | 123456.0 | 剧情/科幻 | 美国 | 2017-05-04 00:00:00 | 142 | 2017 | 8.7 | 美国 |
删除一行
df_mv=df_mv.drop([38738])
df_mv.tail()
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|---|
38733 | 38733.0 | 神学院 S | 46.0 | Adult | 法国 | 1905-06-05 00:00:00 | 58 | 1983 | 8.6 | 美国 |
38734 | 38734.0 | 1935年 | 57.0 | 喜剧/歌舞 | 美国 | 1935-03-15 00:00:00 | 98 | 1935 | 7.6 | 美国 |
38735 | 38735.0 | 血溅画屏 | 95.0 | 剧情/悬疑/犯罪/武侠/古装 | 中国大陆 | 1905-06-08 00:00:00 | 91 | 1986 | 7.1 | 美国 |
38736 | 38736.0 | 魔窟中的幻想 | 51.0 | 惊悚/恐怖/儿童 | 中国大陆 | 1905-06-08 00:00:00 | 78 | 1986 | 8.0 | 美国 |
38737 | 38737.0 | 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме… | 32.0 | 剧情/战争 | 苏联 | 1905-05-30 00:00:00 | 97 | 1977 | 6.6 | 美国 |
列操作
df_mv.columns
Index(['Unnamed: 0', '名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分',
'首映地点'],
dtype='object')
df_mv['名字'][0:5]
0 肖申克的救赎
1 控方证人
2 美丽人生
3 阿甘正传
4 霸王别姬
Name: 名字, dtype: object
df_mv[['名字','类型']][:5]
名字 | 类型 | |
---|---|---|
0 | 肖申克的救赎 | 剧情/犯罪 |
1 | 控方证人 | 剧情/悬疑/犯罪 |
2 | 美丽人生 | 剧情/喜剧/爱情 |
3 | 阿甘正传 | 剧情/爱情 |
4 | 霸王别姬 | 剧情/爱情/同性 |
增加一列
df_mv['序号']=range(1,len(df_mv)+1)
df_mv.head()
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | 序号 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 | 1 |
1 | 1.0 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 | 2 |
2 | 2.0 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 | 3 |
3 | 3.0 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 | 4 |
4 | 4.0 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 | 5 |
删除一列
df_mv=df_mv.drop('序号',axis=1) ## axis = 1 代表列方向
df_mv.head()
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0.0 | 肖申克的救赎 | 692795.0 | 剧情/犯罪 | 美国 | 1994-09-10 00:00:00 | 142 | 1994 | 9.6 | 多伦多电影节 |
1 | 1.0 | 控方证人 | 42995.0 | 剧情/悬疑/犯罪 | 美国 | 1957-12-17 00:00:00 | 116 | 1957 | 9.5 | 美国 |
2 | 2.0 | 美丽人生 | 327855.0 | 剧情/喜剧/爱情 | 意大利 | 1997-12-20 00:00:00 | 116 | 1997 | 9.5 | 意大利 |
3 | 3.0 | 阿甘正传 | 580897.0 | 剧情/爱情 | 美国 | 1994-06-23 00:00:00 | 142 | 1994 | 9.4 | 洛杉矶首映 |
4 | 4.0 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
通过标签选择数据
df.loc[[index],[column]]通过标签选择数据
df_mv.loc[[1,3,4],['名字','评分']]
名字 | 评分 | |
---|---|---|
1 | 控方证人 | 9.5 |
3 | 阿甘正传 | 9.4 |
4 | 霸王别姬 | 9.4 |
df_mv.loc[1,'名字']
'控方证人'
条件选择
选取产地为美国的所有电音
df_mv[df_mv['产地']=='中国大陆'][:5]
Unnamed: 0 | 名字 | 投票人数 | 类型 | 产地 | 上映时间 | 时长 | 年代 | 评分 | 首映地点 | |
---|---|---|---|---|---|---|---|---|---|---|
4 | 4.0 | 霸王别姬 | 478523.0 | 剧情/爱情/同性 | 中国大陆 | 1993-01-01 00:00:00 | 171 | 1993 | 9.4 | 香港 |
21 | 21.0 | 大闹天宫 | 74881.0 | 动画/奇幻 | 中国大陆 | 1905-05-14 00:00:00 | 114 | 1961 | 9.2 | 上集 |
29 | 29.0 | 穹顶之下 | 51113.0 | 纪录片 | 中国大陆 | 2015-02-28 00:00:00 | 104 | 2015 | 9.2 | 中国大陆 |
38 | 38.0 | 茶馆 | 10678.0 | 剧情/历史 | 中国大陆 | 1905-06-04 00:00:00 | 118 | 1982 | 9.2 | 美国 |
45 | 45.0 | 山水情 | 10781.0 | 动画/短片 | 中国大陆 | 1905-06-10 00:00:00 | 19 | 1988 | 9.2 | 美国 |
选取产地为美国,且评分大于9的电影
df_mv[(df_mv.产地=='美国')&(df_mv.评分>9)].head()
或者------------PandasPandas处理Csv和Excel数据详解