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

查询指定的行

  1. student.ix[[0,2,4,5,7]] #这里的ix索引标签函数必须是中括号[]

查询指定的列

  1. student[['Name','Height','Weight']].head() #如果多个列的话,必须使用双重中括号

也可以通过ix索引标签查询指定的列

查询所有女生的信息

  1. student[student['Sex']=='F']

查询出所有12岁以上的女生信息

  1. student[(student['Sex']=='F') & (student['Age']>12)]

查询出所有12岁以上的女生姓名、身高和体重

  1. student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]
  1. student.ix[:,['Name','Height','Weight']].head()

查询指定的行和列

  1. student.ix[[0,2,4,5,7],['Name','Height','Weight']].head()

你只需要使用describe方法就可以实现这样的统计了。

  1. student['Sex'].describe()

除以上的简单描述性统计之外,还提供了连续变量的相关系数(corr)和协方差矩阵(cov)的求解,这个跟R语言是一致的用法。

  1. df.corr()

关于相关系数的计算可以调用pearson方法或kendell方法或spearman方法,默认使用pearson方法。

  1. df.corr('spearman')

如果只想关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关心x1与其余变量的相关系数:

  1. df.corrwith(df['x1'])

数值型变量间的协方差矩阵

  1. df.cov()

六、缺失值处理

现实生活中的数据是非常杂乱的,其中缺失值也是非常常见的,对于缺失值的存在可能会影响到后期的数据分析或挖掘工作,那么我们该如何处理这些缺失值呢?常用的有三大类方法,即删除法、填补法和插值法。
删除法:当数据中的某个变量大部分值都是缺失值,可以考虑删除改变量;当缺失值是随机分布的,且缺失的数量并不是很多是,也可以删除这些缺失的观测。
替补法:对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。
插补法:插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。

这是一组含有缺失值的序列,我们可以结合sum函数和isnull函数来检测数据中含有多少缺失值:

  1. In [130]: sum(pd.isnull(s))
  2. 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)相关推荐

  1. Python数据分析pandas之分组统计透视表

    Python数据分析pandas之分组统计透视表 数据聚合统计 Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小).max(最大).avg(平均值).sum(求和) ...

  2. Python数据分析pandas之数据拼接与连接

    Python数据分析pandas之数据拼接与连接 数据拼接处理 数据拼接处理指的是numpy.pandas里对数据的拼接.连接.合并等多种方法的概称.有时我们处理的数据会分很多步骤,而中间或者最终的结 ...

  3. Python数据分析pandas之dataframe初识

    Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...

  4. Python数据分析pandas之series初识

    Python数据分析pandas之series初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上,它通 ...

  5. Python数据分析pandas之多层高维索引

    Python数据分析pandas之多层高维索引 DataFrame多层索引 多层索引简介 众所周知Pandas的Series和DataFrame存放的是一维和二维数组,那么想存放多维数组就得通过多层索 ...

  6. Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表

    系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...

  7. Python数据分析pandas入门(一)------十分钟入门pandas

    Python数据分析基础 一.导入常用库 二.创建对象 三.查看数据 四.选取 五.通过标签选取 六.通过位置选取 七.布尔索引 八.赋值 九.缺失值处理 十.运算与统计 十一.Apply函数的作用 ...

  8. Python数据分析pandas入门练习题(四)

    Python数据分析基础 Preparation Exercise 1 - Filtering and Sorting Data Step 1. Import the necessary librar ...

  9. 【学习笔记】python数据分析-Pandas

    目录 pandas数据结构 创建Series数据 创建DataFrame数据 pandas的索引操作 重新索引 更换索引 索引选取 选取行 选取列 布尔选择 pandas的增删改 增加行或列 删除行或 ...

  10. python数据分析-pandas学习

    文章目录 一.pandas环境的搭建 1.pandas 简介 2.pandas安装和调用 二.pandas学习 1.pandas简介 2.pandas学习资源 3.pandas核心数据结构 4.Ser ...

最新文章

  1. LeetCode: 104. Maximum Depth of Binary Tree
  2. 【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )
  3. C++多继承时的对象内存模型
  4. nested exception is java.lang.ClassNotFoundException: Interceptor
  5. Android源码-Logger日志系统
  6. html页面 sql注入,使用html仅阻止SQL注入
  7. 【静默】Oracle各类响应文件何在?
  8. 重磅上线|国内首个 Kubernetes SIG-Cloud-Provider 子项目揭秘
  9. npm 安装出错 npm ERR! request to https://registry.npmjs.org/express failed, reason: unable to verify th
  10. 一分钟了解阿里云产品:安骑士
  11. 电脑里的视频被误删了可以用EasyRecovery恢复吗?
  12. SCAU高级语言程序设计--实验5 循环结构(一)(2)
  13. 手机浏览器一键跳转微信加好友和公众号关注的方法
  14. PCBA方案设计——蓝牙脂肪心率秤方案
  15. HttpClient模拟请求
  16. 为什么要安装无人值守称重管理系统?
  17. cf服务器维护到几点,今天CF几点开放?
  18. SSH札记(struts 2)
  19. 【演示文稿制作动画】Focusky教程 | 元素分组
  20. Ubuntu安装破解版MATLAB及问题解决

热门文章

  1. 2021年,我推荐你学习的编程语言,各类语言横向对比
  2. Latex带序号的项目符号列表
  3. Vue - 网站首屏加载等待动画(极简解决方案)
  4. 【Excel VBA】Len的有趣之处——获取的长度怎么不一致?
  5. (vue)在ajax获取数据时使用loading组件不起作用
  6. java后端生成图形验证码、前端接收并展示
  7. CentOs 7源码安装 Python3
  8. 低照度水下图像增强论文(L2UWE)+代码+评价方法
  9. 仿网易LOFTER视差滚动列表
  10. UOS启用wayland