Python Data Analysis Library或Pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。
Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具。
Pandas提供了大量能使我们快速便捷的处理数据的函数和方法。
import pandas as pd
import numpy as np
pandas中有两种常用的基本结构:
•Series
一维数组,与Numpy中的一维数组array类似,二者与Python基本的数据结构List也很相似。特殊的是,Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series种。
•DataFrame
二维的表格型数据结构,很多功能与R种的data.frame类似。可以将DataFrame理解为Series的容器。(R语言的数据框)
##一维Series可以用一维列表初始化,元素的数据类型可以不同
>>> a=pd.Series([1,3,5,np.nan,6,5])
>>> 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'])
>>> 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
##列表赋值给索引
>>> a.index=list('abcdef')
>>> a
a 1.0
b 3.0
c 5.0
d NaN
e 6.0
f 5.0
dtype: float64
###DataFrame初始化
##DataFrame是个二维结构,这里首先构造一组时间序列,作为第一维的下标
>>> date=pd.date_range('20200101',periods=6)
>>> print(date)
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06'],
dtype='datetime64[ns]', freq='D')
###创建一个DataFrame结构
##默认使用0、1、2...,作为索引index
>>> df=pd.DataFrame(np.random.randn(6,4))
>>> df
0 1 2 3
0 0.271304 -0.456538 -0.130672 0.051294
1 1.469260 0.662314 -0.605442 0.840491
2 0.427533 -1.519090 0.939244 0.208238
3 1.161155 1.081891 -0.747801 0.640726
4 1.318555 1.366389 0.861919 0.671478
5 -0.723027 0.219248 0.310172 -0.924437
##index参数设置行索引,columns参数设置列索引
>>> df=pd.DataFrame(np.random.randn(6,4),index=date,columns=list('ABCD'))
>>> df
A B C D
2020-01-01 0.543428 0.049488 1.029735 0.650910
2020-01-02 -0.018345 -0.152546 -0.412190 0.051431
2020-01-03 0.288006 -0.684187 0.077385 0.849828
2020-01-04 1.433992 0.364107 0.540096 -2.032458
2020-01-05 0.451552 -1.267634 2.141649 -1.733130
2020-01-06 -0.131996 0.458916 2.097127 0.157309
###除了向DataFrame中传入二维数组,我们也可以使用字典传入数据
##字典的每个key代表一列,其value可以是各种能够转化为Series的对象
>>> df1=pd.DataFrame({'A':1,'B':pd.Timestamp('20200101'),'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 2020-01-01 1.0 3 test abc
1 1 2020-01-01 1.0 3 train abc
2 1 2020-01-01 1.0 3 test abc
3 1 2020-01-01 1.0 3 train abc
##与Series要求所有的类型都一致不同,DataFrame只要求每一列数据的格式以及类型相同
>>> df1.dtypes
A int64
B datetime64[ns]
C float64
D int32
E category
F object
dtype: object
###查看头尾数据
##head和tail方法可以分别查看最前面几行和最后面几行的数据(默认为5)
>>> df.head()
A B C D
2020-01-01 0.543428 0.049488 1.029735 0.650910
2020-01-02 -0.018345 -0.152546 -0.412190 0.051431
2020-01-03 0.288006 -0.684187 0.077385 0.849828
2020-01-04 1.433992 0.364107 0.540096 -2.032458
2020-01-05 0.451552 -1.267634 2.141649 -1.733130
>>> df.tail(3)
A B C D
2020-01-04 1.433992 0.364107 0.540096 -2.032458
2020-01-05 0.451552 -1.267634 2.141649 -1.733130
2020-01-06 -0.131996 0.458916 2.097127 0.157309
##下标使用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.54342773, 0.04948755, 1.0297351 , 0.65090957],
[-0.01834507, -0.15254608, -0.41218954, 0.05143094],
[ 0.28800614, -0.68418689, 0.07738548, 0.84982819],
[ 1.43399207, 0.36410724, 0.5400965 , -2.03245796],
[ 0.45155238, -1.2676336 , 2.14164888, -1.73312973],
[-0.13199643, 0.45891597, 2.09712718, 0.15730857]])
df_mv=pd.read_excel(r'D:\Desktop\test.xlsx')
#前面加一个r,防止转义字符的干扰,这里是打开一个Excel文件
df_mv.iloc[0] #查看第一行的内容
df_mv.iloc[0:5] #查看前五行的内容
df_mv.loc[0:5] #这个方法是一个完全的闭区间,查看前六行的内容
df_mv=df_mv.drop([index]) #添加索引代号,删除某一行的内容
dit={'名字':'复仇者联盟3',
'投票人数':123456,
'类型':'剧情/科幻',
'产地':'美国',
'上映时间':'2017-05-04 00:00:00',
'时长':142,
'年代':2017,
'评分':8.7,
'首映地点':'美国'}
s=pd.Series(dit) #想要添加一个行的操作,就先建立一个新的Series
s.name=38738 #也就是建立索引号
s #一定要带上双引号呀,而且必须是英文状态下的标点符号
df_mv=df_mv.append(s) #类似列表的添加方式
df_mv.columns #查看列的具体属性
df_mv['名字'][0:5] #查看列的具体内容,双索引 [' 列名 '][index]
df_mv[['名字','类型']][:5] #查看多列的具体内容,使用列表的形式
df_mv['序号']=range(1,len(df_mv)+1) #直接创建新的一列,与R语言极其相似,就是直接添加
df_mv=df_mv.drop('序号',axis=1) #删除一列的操作 :axis默认为0,横向,改为1,即为纵向
##通过标签选择数据:
df.loc[[index],[column]] #通过标签选择数据
df_mv.loc[[1,3,4],['名字','评分']] #先行后列,这个是多行多列
df_mv.loc[1,'名字']
##条件选择:
df_mv[df_mv['产地']=='中国大陆'][:5] #选取产地为中国大陆的前五个电影内容
df_mv[(df_mv.产地=='美国')&(df_mv.评分>9)].head() #选取产地为美国,且评分大于9的电影
df_mv[((df_mv.产地=='美国')|(df_mv.产地=='中国大陆'))&(df_mv.评分>9)].head()
#选取产地为美国或中国大陆,且评分大于9的电影
dropna:根据标签中的缺失值进行过滤,删除缺失值
fillna:对缺失值进行填充
isnull:返回一个布尔值对象,判断哪些值是缺失值
notnull:isnull的否定式
df.dropna(参数)
subset=['列名']:删除该列为空的行
how='all':删除全为空值的行或列
inplace=True:覆盖之前的数据
axis=0:选择行或列(=0,删除一行;=1,删除一列),默认为0(这个经常出现,也就是删除行)
异常值,即在数据集中存在不合理的值,又称离群点。比如年龄为-1,笔记本电脑重量为1吨等等,都属与异常值的范围。
对于异常值,一般来说数量都会很少,在不影响整体数据分布的情况下,我们直接删除就可以了。
数据处理之后,然后将数据重新保存到原文件。
df_mv.to_excel('test.xlsx') ##数据保存,这很重要
df['投票人数'].dtype #查看列的数据类型
df['投票人数']=df['投票人数'].astype('int') #astype转换方法,格式转换
可以通过数据的格式转换,检查出一些异常值
###单值排序
##默认索引排序
df[:10] ##根据index进行排序
##默认升序排列,改变排序标准
df.sort_values(by='投票人数')[:5]
##降序排列
df.sort_values(by='投票人数',ascending=False)[:5]#ascending是升序的意思
###多值排序
##也就是按照多个标准先后排序
df.sort_values(by=['评分','投票人数'],ascending=False)[:5]
##先降序,后升序
df.sort_values(by=['评分','投票人数'],ascending=[False,True])[:5]
对dataframe中的数值数据进行描述性统计
dataframe.describe()
通过描述性统计,可以发现一些异常值,很多异常值往往是需要我们逐步去发现的 。
删除行后,需要重新分配索引 index ,
df.index=range(len(df)) # 长度函数len()最值和求和:max(),min(),sum()
均值和中值:mean(),median()
方差和标准差:var(),std()
## 相关系数
df[['投票人数','评分']].corr()## 协方差矩阵
df[['投票人数','评分']].cov()
## 某列的所有不同的取值,重复值不统计,统计唯一值!!!数组形式输出
df['产地'].unique()
##重复数据替换
df['产地'].replace('USA','美国',inplace=True) #右边替换左边,就地覆盖操作
df['产地'].replace(['西德','苏联'],['德国','俄罗斯'],inplace=True)#多替换使用列表就行替换
##value_counts()方法计数,默认是从大到小的排序,计算每一年的总数
df['年代'].value_counts()[:10]
Pandas提供了一个数据透视表功能,名为pivot_table。
使用pivot_table的一个挑战是,你需要确保你理解你的数据,并清楚的知道你通过透视表解决了什么问题。
虽然pivot_table看起来知识一个简单的函数,但是它能够快速的对数据进行强大的分析。应该类似于数据库的视图view。(针对数值型列)
pd.set_option('max_columns',100) ##设置显示的最大列
pd.set_option('max_rows',500) ##设置显示的最大行,方便查看所有的结果信息
pd.pivot_table(df,index=['年代'])
##需要一个dataframe参数,还要有个索引,默认的数值运算时:数值型变量的均值。
##多个索引index=['','']
##实际上,大多数的pivot_table参数可以通过列表获取多个值作为索引
pd.pivot_table(df,index=['年代','产地'])
##指定需要统计汇总的数据values
#去除不需要的默认值参数,显示需要的参数列
pd.pivot_table(df,index=['年代','产地'],values=['评分'])
##指定函数aggfunc()
pd.pivot_table(df,index=['年代','产地'],values=['投票人数'],aggfunc=np.sum)
#改变默认的聚合运算,求和值代替平均值
##通过将“投票人数”和“评分”列进行对应分组,对“产地”实现数据聚合和总结
pd.pivot_table(df,index=['产地'],values=['投票人数','评分'],aggfunc=[np.sum,np.mean])
##非数值处理 fill_value
#非数值(NaN)难以处理,如果想移除他们,可以使用 fill_value 将其设置为0
pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0)
##计算总合数据 margins=True
pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
#计算每一列的总和数据
###对不同值执行不同函数
##可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加简洁才性。
#对各个产地的投票人数求和,对评分求均值,使用字典,传入键对值
pd.pivot_table(df,index=['产地'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
##按照多个索引来进行汇总
pd.pivot_table(df,index=['产地','年代'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)