Python数据分析(Pandas)
pandas基础数据结构,有以下两种:
Series,与array很像也和list相同,Series能保存不同的种数据类型,包括字符串、bool值、数字等等。
DataFrame,二维的表格型数组结构,以下内容以DataFrame为主。
Series初始化(类型转换)s=pd.Series([1,2,3,np.nan,6.8])
索引-行标签,查看值 a.values,a[0],切片都和numpy一样。
索引赋值 a.index.name="索引",a.index=list("abcdef"),就不是01234了。
如果赋值给索引了,再想取切片的话,就不是0:3这样的了,而是s["a":"c"](注意,这里是闭区间,不是左闭右开)
DataFrame,是一个二维结构。现在构造一个时间序列
data=pd.date_range("20190101",periods=6)(这里要写起点,周期)
创建一个DataFrame结构,df=pd.DataFrame(np,random,randn(6,4),index=data,columns=list("ABCD"))。如果不指定index和columns,则默认从0开始的数字。随机生成六行四列的随机数组。
除了传入二维数组,我们也可以使用字典传入数据:
df2=pd.DataFrame(["A":1.2,"B":pd.Timestamp("20181001"),"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"])
查看头尾数据
df.head(),默认前5行
df.tail(3),查看最后3行数据。
df.dtypes,查看所有的数据类型
下标的查看,df.index
列标的查看,df.columns
数据值的查看,df.values
pandas读取数据及数据操作
读取excel文件df=pd.read_excel(r“文件路径”),前面加r的意思是不需要对我写的路径进行转义,我写的是什么就是什么。
读取csv文件df=pd.csv.read_csv("文件路径")
行操作,df.iloc[0],df.iloc[0:5]这样的操作。df.loc[0:5],唯一不同就是不是左闭右开,索引5也在里面了。
添加一行dit={把每一列数据,相当于字典输入。} s=pd.Series(dit) s.name=前面数据索引号加1 df=df.append(s)
删除一行 df=df.drop([索引号])
列操作 df.columns,查看列名。df["名字"][:5],排在前5的名字。df["xx","xx","xx"]查看多行。
增加一列,df["y"]=range(1,len(df)+1),因为range右边不包含,所以要加一。
删除一列,df=df.drop("y",axis=1)
通过标签选择数据df.loc[[index],[column]]
条件选择 df[df["产地"]=="美国"] df[df["产地"]=="美国"][:5] 只看前5行
df[(df.产地==“美国”)&(df.评分>9)]
df[((df.产地==“美国”)|(df.产地==“中国大陆”))&(df.评分>9)]
缺失值处理
1、dropna 根据标签中的缺失值进行过滤,删除缺失值
参数解释:how=“all”,删除全为空的行或列,inplace=True覆盖之前的数据,axis=0(行)axis=1(列)默认选择行
2、fillna 对缺失值进行填充 df.fiilna(0)
均值填充df["评分"].fillna(np.mean(df["评分"]),inplace=True)
3、isnull 返回布尔值,判断哪些值是缺失值 df.isnull() df["名字"].isnull()
4、notnull isnull的否定式
处理异常值
df[df.投票人数<0]
df[df["投票人数"]%1!=0](不是整数)df[df["投票人数"]%1==0](保留整数)
数据保存
df.to_excel("保存文件的路径")
数据格式的转换
查看数据df["XXX"].dtype
类型转换df["XXX"]=df["XXX"].astype("int")
int整数str字符串
将年份转换为整数
df["年代"].astype("int")
查看错误数据df[df.年代=="2008\u200e"]或者写df[df["年代"]=="2008\u200e"]
查看错误数据的具体值df[df.年代=="2008\u200e"]["年代"].values
df.loc[index,"年代"]=2008,然后在查看df.loc[index],数据好了再转换就好啦
将时长转换为整数格式
删除异常值df.drop([index],inplace=True),后面参数True是替换之前的数据。
排序
按照投票人数来排序
df.sort_values(by="投票人数",ascending=False),ascending这个参数是空值升序或者降序,False就是从大到小。
多个值,先按照评分排序,再按照投票人数
df.sort_values(by=["评分","投票人数"],ascending=False)
基本统计分析
(1)描述性统计对dataframe中的数值型数据进行描述性统计 df.describe()
通过描述性统计,可以发现异常值
df[df["年代"]>2019],找出之后可以删掉,或者一句到位如下。
df.drop(df[df["年代"]>2019].index,inplace=True)
对index重新赋值df.index=range(len(df))
(2)最值
df["投票人数"].max(),df["投票人数"].min()
(3)均值和中值
df["投票人数"].mean(),df["投票人数"].median()
(4)方差var和标准差std,表示数据的离散程度
df["投票人数"].var(),df["投票人数"].std()
(5)求和
df["投票人数"].sum()
(6)相关系数corr,协方差cov
df[["投票人数","评分"]].corr(),df[["投票人数","评分"]].cov()
(7)计数
len(df),这是总数值。
产地中包含了重复值,所以要分类汇总再看。
df["产地"].unique(),会输入不管重复几次的值。
len(df["产地"].unique()),会输出数值,就是有几个产地。
替换,美国和USA是一样的,由于历史原因造成的,所以要数据替换,再合并。
df["产地"].replace("USA","美国",inplace=True)
df["产地"].replace(["西德","苏联"],["德国","俄罗斯"],inplace=True)
计算每一年电影的数量:
df["年代"].value_counts()
电影产出前5的国家或地区
df["产地"].value_counts()[:5]
保存数据
df.to_excel("XXX.xlsx")
数据透视
pandas里面的数据透视表函数叫:pivot_table
1、基础形式
pd.pivot_table(df,index=["年代"]),以年代为索引,没有参数,就是默认计算均值。
展示没有完整展示,可以自己手动定义,查看所有结果。
再这句代码之前设置
pd.set_option("max_columns",100),展示100列
pd.set_option("max_rows",500),展示500列
再运行,就会展示所有数据了。
2、也可以有多个索引,实际上,大多数的数据透视参数可以通过列表获取多个值。进行聚合计算。
pd.pivot_table(df,index=["年代","产地"])
3、也可以指定需要统计汇总的数据
pd.pivot_table(df,index=["年代","产地"],values=["评分"])
4、还可以指定函数,来统计不同的统计值
pd.pivot_table(df,index=["年代","产地"],values=["投票人数"],aggfunc=np.sum)
通过将”投票人数“列和”评分“列进行对应分组,对”产地“实现数据聚合和总结。
pd.pivot_table(df,index=["产地"],values=["投票人数","评分"],aggfunc=[np.sum,np.mean])
5、非数值(NaN)难以处理,如果想移除他们,可以使用”fill_value“将其设置为0.即将空值设置为0.
pd.pivot_table(df,index=["产地"],aggfunc=[np.sum,np.mean],fill_value=0)
6、加入margins=True,可以再下方显示一些总和数据。
pd.pivot_table(df,index=["产地"],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
7、对不同值执行不同的函数:可以向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
求出1994年的电影平均分,和1924年的电影平均分。
table=pd.pivot_table(df,index=["年代"],values=["投票人数","评分"],aggfunc={"投票人数":np.sum,"评分":np.mean},fill_value=0)
table[table.index==1994] ,或者table[table.index==1924]
评分均分前10的年份,table.sort_values("评分",ascending=False)[:10]
Series层次化索引,table可以直接补充没打完的函数、包什么的。
s=pd.Series(np.arrange(1,10),index=[["a","a","a","b","b","c","c","d","c"],[1,2,3,1,2,3,1,2,3]])
(类似excel的合并单元格)
查看具体index和数据、取a到c的所有数据、取内层第一个数据、取具体的数据a对应的2对应的值,s.index,s["a"],s["a":"c"],s[:,1],s["a",2]
可以通过unstack方法可以将Series变成一个DataFrame,容易产生缺失值
s.unstack(),转回层次化索引的Series用:s.unstack().stack()。
DataFrame的层次化索引
生成一个四行三列的DataFrame,reshape重新约定了它的形状,然后定义四层索引。
data=pd.DataFrame(np.arange(12).reshape(4,3),index=[["a","a","b","b"],[1,2,1,2]],co;umn=[["A","A","B"],["Z","X","C"]])
index重命名行、列、调换外层和内层索引的顺序,data.index.names=["row1","row2"],data.columns.names=["col1","col2"],data.swaplevel("row1","row2")
把咱们电影数据处理成多层次索引
想把产地和年代设成索引,产地是外层索引,年代为内层索引
set_index可以把列变成索引。
reset_index是把索引变成列。
df=df.set_index(["产地","年代"])
每一个索引都是一个元组
df.index[0]
获取所有美国电影,由于产地信息已经变成索引,因此要用.loc方法
df.loc["美国"]
取消多层索引
df.reset_index(),相当于全部取消了
数据旋转
行列转化,即为转置。data.T
数据分组,分组运算
GroupBy技术:实现数据的分组和分组运算,作用类似于数据透视表
按照电影的产地进行分组
group=df.groupyby(df["产地"])
先定义一个分组变量group
type(group)
可以计算分组后的各个统计量
group.mean()
计算每年的平均评分
df["评分"].groupby(df["年代"]).mean()
注意:只会对数值变量进行分组运算(如果是字符串就不会这样操作了,也不会显示)
我们也可以传入多个分组变量
df.groupby([df["产地"],df["年代"]]).mean()
获取每个地区,每一年的电影的评分均值
df["评分"].groupby([df["产地"],df["年代"]])
means=group.mean()
离散化处理,即为区间化,分组,pandas提供了cut()函数,参数如下:
pd.cut(x,bins,right=True,labels=None,retbins=False,prcision=3,include_lowset=False)
把评分进行离散化处理,评分9以上定义为A,7-9定义为B,5-7为C,3-5为D,3以下为E。
pd.cut(df["评分"],[0,3,5,7,9,10],labels=["E","D","C","B","A"]),就是把这些数据划分到一些区间里去,然后区间对应ABCDE等级里面去。
根据投票人数,来刻画电影热门程度,投票越多的热门程度越高。
bins=np.percentile(df["投票人数"],[0,20,40,60,80,100])
df["热门程度"]=pd.cut(df["投票人数"],bins,labels=["E","D","C","B","A"])
冷门高分电影
df[(df.热门程度=="E")&(df.评分等级=="A")]
烂片
df[(df.热门程度=="A")&(df.评分等级=="E")]
合并数据集
(1)append,在末尾添加一些数据的时候,多用append,相当于一个上下拼接,最好数据结构一样。
df_usa=df[df.产地=="美国"]
df_china=df[df.产地=="中国大陆"]
df_china.append(df_usa)
(2)merge,最常用,相当于横向拼接。
pd.merge(left,right,how="inner",on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes="_x","_y"),copy=True,indicator=False)
内连接,就是交集,如果选择左边,就是保证左边不变,右边有交集就补充,左没有右有就不要。
on是连接键,必须在左和右都找到相同就用on,不一样就分别设置。
sort:是通过连接字典顺序排序,默认True,设置为False将在大多数情况下极大提高性能。
df2=df2.sample(frac=1),这样相当于打乱数据,上下顺序打乱,index还是原来的lindex。
重新设定index,df2.index=range(len(df2))。
(3)concat:将多个数据集批量合并
dff=pd.concat([df1,df2,df3],axis=0),上下拼接,axis默认为0。
dff=pd.concat([df1,df2,df3],axis=1),左右拼接。
统计分析:
np.random.seed(1234)
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
d1.count() #非空元素计算
d1.min() #最小值
d1.max() #最大值
d1.idxmin() #最小值的位置,类似于R中的which.min函数
d1.idxmax() #最大值的位置,类似于R中的which.max函数
d1.quantile(0.1) #10%分位数
d1.sum() #求和
d1.mean() #均值
d1.median() #中位数
d1.mode() #众数
d1.var() #方差
d1.std() #标准差
d1.mad() #平均绝对偏差
d1.skew() #偏度
d1.kurt() #峰度
d1.describe() #一次性输出多个描述性统计指标
必须注意的是,descirbe方法只能针对序列或数据框,一维数组是没有这个方法的
这里自定义一个函数,将这些统计描述指标全部汇总到一起:
def stats(x):
return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),x.quantile(.75),x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),
x.std(),x.skew(),x.kurt()],index = ['Count','Min','Whicn_Min','Q1','Median','Q3','Mean','Max','Which_Max','Mad','Var','Std','Skew','Kurt'])
stats(d1)
查询数据的前5行或末尾5行
student.head()
student.tail()
查询指定的行
student.ix[[0,2,4,5,7]] #这里的ix索引标签函数必须是中括号[]
查询指定的列
student[['Name','Height','Weight']].head() #如果多个列的话,必须使用双重中括号
也可以通过ix索引标签查询指定的列
查询所有女生的信息
student[student['Sex']=='F']
查询出所有12岁以上的女生信息
student[(student['Sex']=='F') & (student['Age']>12)]
查询出所有12岁以上的女生姓名、身高和体重
student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]
student.ix[:,['Name','Height','Weight']].head()
查询指定的行和列
student.ix[[0,2,4,5,7],['Name','Height','Weight']].head()
你只需要使用describe方法就可以实现这样的统计了。
student['Sex'].describe()
除以上的简单描述性统计之外,还提供了连续变量的相关系数(corr)和协方差矩阵(cov)的求解,这个跟R语言是一致的用法。
df.corr()
关于相关系数的计算可以调用pearson方法或kendell方法或spearman方法,默认使用pearson方法。
df.corr('spearman')
如果只想关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关心x1与其余变量的相关系数:
df.corrwith(df['x1'])
数值型变量间的协方差矩阵
df.cov()
六、缺失值处理
现实生活中的数据是非常杂乱的,其中缺失值也是非常常见的,对于缺失值的存在可能会影响到后期的数据分析或挖掘工作,那么我们该如何处理这些缺失值呢?常用的有三大类方法,即删除法、填补法和插值法。
删除法:当数据中的某个变量大部分值都是缺失值,可以考虑删除改变量;当缺失值是随机分布的,且缺失的数量并不是很多是,也可以删除这些缺失的观测。
替补法:对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。
插补法:插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。
这是一组含有缺失值的序列,我们可以结合sum函数和isnull函数来检测数据中含有多少缺失值:
In [130]: sum(pd.isnull(s))
Out[130]: 9
直接删除缺失值s.dorpna(),默认情况下,dropna会删除任何含有缺失值的行。
返回结果表明,数据中只要含有缺失值NaN,该数据行就会被删除,如果使用参数how=’all’,则表明只删除所有行为缺失值的观测。s.dorpna(how=’all’)
使用一个常量来填补缺失值,可以使用fillna函数实现简单的填补工作:
1)用0填补所有缺失值 df.fillna(0)
2)采用前项填充或后向填充 df.fillna(method="ffill"),用前一个观测值填充,df.fillna(method="bfill"),用后一个观测值填充。
3)使用常量填充不同的列,df.fillna({"x1":1,"x2":2,"x3":3})
4)用均值或中位数填充各自的列
x1_median=df["x1"].median()
x2_mean=df["x2"].mean()
df.fillna({"x1":x1_median,"x2":x2_mean})
Python数据分析(Pandas)相关推荐
- Python数据分析pandas之分组统计透视表
Python数据分析pandas之分组统计透视表 数据聚合统计 Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小).max(最大).avg(平均值).sum(求和) ...
- Python数据分析pandas之数据拼接与连接
Python数据分析pandas之数据拼接与连接 数据拼接处理 数据拼接处理指的是numpy.pandas里对数据的拼接.连接.合并等多种方法的概称.有时我们处理的数据会分很多步骤,而中间或者最终的结 ...
- Python数据分析pandas之dataframe初识
Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...
- Python数据分析pandas之series初识
Python数据分析pandas之series初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上,它通 ...
- Python数据分析pandas之多层高维索引
Python数据分析pandas之多层高维索引 DataFrame多层索引 多层索引简介 众所周知Pandas的Series和DataFrame存放的是一维和二维数组,那么想存放多维数组就得通过多层索 ...
- Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表
系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...
- Python数据分析pandas入门(一)------十分钟入门pandas
Python数据分析基础 一.导入常用库 二.创建对象 三.查看数据 四.选取 五.通过标签选取 六.通过位置选取 七.布尔索引 八.赋值 九.缺失值处理 十.运算与统计 十一.Apply函数的作用 ...
- Python数据分析pandas入门练习题(四)
Python数据分析基础 Preparation Exercise 1 - Filtering and Sorting Data Step 1. Import the necessary librar ...
- 【学习笔记】python数据分析-Pandas
目录 pandas数据结构 创建Series数据 创建DataFrame数据 pandas的索引操作 重新索引 更换索引 索引选取 选取行 选取列 布尔选择 pandas的增删改 增加行或列 删除行或 ...
- python数据分析-pandas学习
文章目录 一.pandas环境的搭建 1.pandas 简介 2.pandas安装和调用 二.pandas学习 1.pandas简介 2.pandas学习资源 3.pandas核心数据结构 4.Ser ...
最新文章
- LeetCode: 104. Maximum Depth of Binary Tree
- 【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )
- C++多继承时的对象内存模型
- nested exception is java.lang.ClassNotFoundException: Interceptor
- Android源码-Logger日志系统
- html页面 sql注入,使用html仅阻止SQL注入
- 【静默】Oracle各类响应文件何在?
- 重磅上线|国内首个 Kubernetes SIG-Cloud-Provider 子项目揭秘
- npm 安装出错 npm ERR! request to https://registry.npmjs.org/express failed, reason: unable to verify th
- 一分钟了解阿里云产品:安骑士
- 电脑里的视频被误删了可以用EasyRecovery恢复吗?
- SCAU高级语言程序设计--实验5 循环结构(一)(2)
- 手机浏览器一键跳转微信加好友和公众号关注的方法
- PCBA方案设计——蓝牙脂肪心率秤方案
- HttpClient模拟请求
- 为什么要安装无人值守称重管理系统?
- cf服务器维护到几点,今天CF几点开放?
- SSH札记(struts 2)
- 【演示文稿制作动画】Focusky教程 | 元素分组
- Ubuntu安装破解版MATLAB及问题解决