Pandas的常用方法

Python Data Analysis Library或Pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。

Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具。

Pandas提供了大量能使我们快速便捷的处理数据的函数和方法。


导入:

import pandas as pd
import numpy as np

Pandas的基本数据结构:

pandas中有两种常用的基本结构:

•Series
一维数组,与Numpy中的一维数组array类似,二者与Python基本的数据结构List也很相似。特殊的是,Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series种。

•DataFrame
二维的表格型数据结构,很多功能与R种的data.frame类似。可以将DataFrame理解为Series的容器。(R语言的数据框)

Series:

##一维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初始化
##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]])

 

 Pandas读取数据及数据操作:(下面只介绍一些操作的具体功能,在此就不通过运行代码实现了):

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') ##数据保存,这很重要

Pandas操作:

数据格式转换:

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()

Pandas的常用方法_第1张图片

通过描述性统计,可以发现一些异常值,很多异常值往往是需要我们逐步去发现的 。

删除行后,需要重新分配索引 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)

透视表过滤,本身就是一个dataframe,所以操作相同呀!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Python数据分析入门,大数据,数据分析,pandas,numpy)