数据分析之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
0123
0-1.4901251.298987-0.5433611.221980
1-0.8497090.118608-0.9557150.144980
2-0.599598-0.756037-1.795249-0.282495
3-0.3325861.750622-1.493345-2.100013
4-0.905893-0.254791-1.476728-0.001651
5-1.121065-1.861881-0.5024200.523135
df=pd.DataFrame(np.random.randn(6,4),index=date,columns=list('ABCD'))
df    ##index参数设置行索引,columns参数设置列索引,默认情况下不指定index和columns,他们的值从0开始
ABCD
2023-03-120.443978-0.5682800.539422-1.808815
2023-03-13-0.9419461.600655-0.165418-0.143333
2023-03-140.0581861.299691-0.722582-0.258170
2023-03-150.912441-1.347266-0.827097-1.189625
2023-03-160.4271250.010411-0.3904111.172277
2023-03-17-0.584286-0.4281190.5363051.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
ABCDEF
012023-03-121.03testabc
112023-03-121.03trainabc
212023-03-121.03testabc
312023-03-121.03trainabc

字典的每个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()
ABCD
2023-03-120.443978-0.5682800.539422-1.808815
2023-03-13-0.9419461.600655-0.165418-0.143333
2023-03-140.0581861.299691-0.722582-0.258170
2023-03-150.912441-1.347266-0.827097-1.189625
2023-03-160.4271250.010411-0.3904111.172277
df.tail(3) ##后三行
ABCD
2023-03-150.912441-1.347266-0.827097-1.189625
2023-03-160.4271250.010411-0.3904111.172277
2023-03-17-0.584286-0.4281190.5363051.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名字投票人数类型产地上映时间时长年代评分首映地点
00肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
22美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
33阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
44霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.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名字投票人数类型产地上映时间时长年代评分首映地点
00肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
22美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
33阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
44霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港

也可以使用 loc

df_mv.loc[0:5]  ## 两边都包
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
00肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
22美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
33阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
44霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港
55泰坦尼克号157074.0剧情/爱情/灾难美国2012-04-10 00:00:0019420129.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名字投票人数类型产地上映时间时长年代评分首映地点
3873438734.01935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国
3873538735.0血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国
3873638736.0魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国
3873738737.0列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме…32.0剧情/战争苏联1905-05-30 00:00:009719776.6美国
38738NaN复仇者联盟3123456.0剧情/科幻美国2017-05-04 00:00:0014220178.7美国
删除一行
df_mv=df_mv.drop([38738])
df_mv.tail()
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
3873338733.0神学院 S46.0Adult法国1905-06-05 00:00:005819838.6美国
3873438734.01935年57.0喜剧/歌舞美国1935-03-15 00:00:009819357.6美国
3873538735.0血溅画屏95.0剧情/悬疑/犯罪/武侠/古装中国大陆1905-06-08 00:00:009119867.1美国
3873638736.0魔窟中的幻想51.0惊悚/恐怖/儿童中国大陆1905-06-08 00:00:007819868.0美国
3873738737.0列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме…32.0剧情/战争苏联1905-05-30 00:00:009719776.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名字投票人数类型产地上映时间时长年代评分首映地点序号
00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节1
11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国2
22.0美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利3
33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映4
44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港5
删除一列
df_mv=df_mv.drop('序号',axis=1) ## axis = 1 代表列方向
df_mv.head()
Unnamed: 0名字投票人数类型产地上映时间时长年代评分首映地点
00.0肖申克的救赎692795.0剧情/犯罪美国1994-09-10 00:00:0014219949.6多伦多电影节
11.0控方证人42995.0剧情/悬疑/犯罪美国1957-12-17 00:00:0011619579.5美国
22.0美丽人生327855.0剧情/喜剧/爱情意大利1997-12-20 00:00:0011619979.5意大利
33.0阿甘正传580897.0剧情/爱情美国1994-06-23 00:00:0014219949.4洛杉矶首映
44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.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名字投票人数类型产地上映时间时长年代评分首映地点
44.0霸王别姬478523.0剧情/爱情/同性中国大陆1993-01-01 00:00:0017119939.4香港
2121.0大闹天宫74881.0动画/奇幻中国大陆1905-05-14 00:00:0011419619.2上集
2929.0穹顶之下51113.0纪录片中国大陆2015-02-28 00:00:0010420159.2中国大陆
3838.0茶馆10678.0剧情/历史中国大陆1905-06-04 00:00:0011819829.2美国
4545.0山水情10781.0动画/短片中国大陆1905-06-10 00:00:001919889.2美国

选取产地为美国,且评分大于9的电影

df_mv[(df_mv.产地=='美国')&(df_mv.评分>9)].head()
或者------------PandasPandas处理Csv和Excel数据详解

pandaspandas中的常见函数

PandasPandas Daframe 常用用法

PandasPandas Daframe 常用用法

jupyter入门之pandas

pandaspandas.to_datatime()---时间格式转换