码迷,mamicode.com
首页 > 其他好文 > 详细

数据分析 02 -Pandas

时间:2020-10-06 20:13:42      阅读:31      评论:0      收藏:0      [点我收藏+]

标签:出错   pen   使用数组   nbsp   localhost   ext   原来   div   concat   

Pandas的数据结构

导入pandas:

三剑客

import pandas as pd
from pandas import Series,DataFrame
import numpy as np

1、Series

 

Series是一种类似与一维数组的对象,由下面两个部分组成:

  • values:一组数据(ndarray类型)

  • index:相关的数据索引标签

 

1)Series的创建

两种创建方式:

(1) 由列表或numpy数组创建

默认索引为0到N-1的整数型索引

#使用列表创建Series
Series(data=[1,2,3,4],index=[ds,dsa,re,gr],name=haha)#index参数指定索引

#使用numpy创建Series
Series(data=np.arange(10,60,6))

 

(2) 由字典创建:不能在使用index.但是依然存在默认索引

 

注意:数据源必须为一维数据

dic = {
    math:100,
    English:50
}
Series(data=dic,name=qimo)

 

2)Series的索引和切片

 

可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的是一个Series类型)。

(1) 显式索引:

- 使用index中的元素作为索引值 - 使用s.loc[](推荐):注意,loc中括号中放置的一定是显示索引

注意,此时是闭区间

s = Series(np.random.randint(60,100,size=(5,)),index=[a,b,c,d,e])
s

s[b]

(2) 隐式索引:

- 使用整数作为索引值
- 使用.iloc[](推荐):iloc中的中括号中必须放置隐式索引

注意,此时是半开区间

s.iloc[1]

s.iloc[[1,2,3]]

切片:隐式索引切片和显示索引切片

 
  • 显示索引切片:index和loc
s.loc[b]
  • 隐式索引切片:整数索引值和iloc
s.loc[a:c]

 

3)Series的基本概念

 

可以把Series看成一个定长的有序字典

向Series增加一行:相当于给字典增加一组键值对

s[f] = 100
s

可以通过shape,size,index,values等得到series的属性

s.index
s.values
s.size
s.shape

可以使用s.head(),tail()分别查看前n个和后n个值

s.head(3)
s.tail(3)

对Series元素进行去重

s = Series(data=[1,1,2,2,3,3,4,4,4,5,6,7,8,7,7,66,43,342,6665,444,333,444])
s.unique()   #Series中的去重函数

当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况

  • 使得两个Series进行相加

s1 = Series(data=[1,2,3,4,5],index=[a,b,c,d,e])
s2 = Series(data=[1,2,3,4,5],index=[a,b,c,f,g])
s = s1+s2
s

可以使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函数检测缺失数据

s.loc[s.notnull()]   #空值检测,过滤

s.iloc[[True,False,True,True,False,True,True]]   #True/False是可以作为Series的索引

4)Series的运算

(1) + - * /

(2) add() sub() mul() div() : s1.add(s2,fill_value=0)

(3) Series之间的运算

- 在运算中自动对齐不同索引的数据
- 如果索引不对应,则补NaN

 

2、DataFrame

 

DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

  • 行索引:index

  • 列索引:columns

  • 值:values

 

1)DataFrame的创建

最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。

此外,DataFrame会自动加上每一行的索引。

使用字典创建的DataFrame后,则columns参数将不可被使用。

同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。

DataFrame(data=np.random.randint(60,100,size=(3,3)),index=[a,b,c],columns=[A,B,C])

DataFrame属性:values、columns、index、shape

df = DataFrame(data=np.random.randint(60,100,size=(3,3)),index=[a,b,c],columns=[A,B,C])
df

df.values
df.index
df.columns

2)DataFrame的索引

 

(1) 对列进行索引

- 通过类似字典的方式 df[‘q‘] - 通过属性的方式 df.q

可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。

df = DataFrame(data=np.random.randint(60,150,size=(4,2)),index=[chinese,math,english,lizong],columns=[zhangsan,li])
df

#修改列索引
df[li] = [1,2,3,4]
df

#获取前两列
df[[zhangsan,li]]

df.li

df[li]

(2) 对行进行索引

- 使用.loc[]加index来进行行索引 - 使用.iloc[]加整数来进行行索引

同样返回一个Series,index为原来的columns。

df.loc[math]

df.iloc[1]

# 取出前2行
df.iloc[[0,1]]

(3) 对元素索引的方法
- 使用列索引
- 使用行索引(iloc[3,1] or loc[‘C‘,‘q‘]) 行索引在前,列索引在后

df.loc[math,zhangsan]

切片:

 

【注意】 直接用中括号时:

  • 索引表示的是列索引

  • 切片表示的是行切片

df[math:lizong]

在loc和iloc中使用切片(切列) :      df.loc[‘B‘:‘C‘,‘丙‘:‘丁‘]

df.loc[:,zhangsan:li]

3)DataFrame的运算

(1) DataFrame之间的运算

同Series一样:

  • 在运算中自动对齐不同索引的数据

  • 如果索引不对应,则补NaN

示例:
      假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。

假设张三期中考试数学被发现作弊,要记为0分,如何实现?

李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?

后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现

df = DataFrame(data=np.random.randint(60,150,size=(4,2)),index=[chinese,math,english,lizong],columns=[zhangsan,li])
df

df1 = df.copy()
df1

#假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。

df2= df1.copy()
df2

(df1+df2)/2

假设张三期中考试数学被发现作弊,要记为0分,如何实现?
df2.loc[math,zhangsan] =0
df2

# 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
df2.li += 100
df2

# 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
df2 +=10
df2

处理丢失数据

 

有两种丢失数据:

  • None
  • np.nan(NaN)
 

1. None

None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

2. np.nan(NaN)

np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

import numpy as np
import pandas as pd
from pandas import DataFrame,Series

type(None)
type(np.nan)

3. pandas中的None与NaN

 

1) pandas中None与np.nan都视作np.nan

np.random.seed(10)
df = DataFrame(np.random.randint(50,200,size=(6,5)),index=[a,b,c,d,e,f],columns=[A,B,C,D,E])
df

#将某些数组元素赋值为nan
df.iloc[1,3] = None
df.iloc[2,2] = np.nan
df.iloc[4,2] = None
df

 

2) pandas处理空值操作

  • isnull()

  • notnull()

  • dropna(): 过滤丢失数据

  • fillna(): 填充丢失数据

(1)判断函数
- ``isnull()`` 一般后面往往跟的是any()
- ``notnull()``一般后面往往跟的是all()

df.isnull().any(axis=1) # 只要有一个true 就返回true
df.isnull().all(axis=1) #只要有一个False 就返回False,全部位true才返回true

df.notnull().all(axis=1)

df.dropna() 可以选择过滤的是行还是列(默认为行):axis中0表示行,1表示的列

df.dropna(axis=0) # 在drop系列函数中,轴向的参数值0表示的是行,1表示的是列

df.drop(labels=‘A‘,axis=1) # drop 可以删除任意的行和列

 

(3) 填充函数 Series/DataFrame
- ``fillna()``:value和method参数

np.random.seed(10)
df = DataFrame(np.random.randint(50,200,size=(6,5)),index=[a,b,c,d,e,f],columns=[A,B,C,D,E])
df

#将某些数组元素赋值为nan
df.iloc[1,3] = None
df.iloc[2,2] = np.nan
df.iloc[4,2] = None
df

df.fillna(value=10)

method 控制填充的方式 bfill后向填充 ffill前向填充,可以选择前向填充还是后向填充

df.fillna(method=ffill,axis=0)

df.fillna(method=bfill,axis=0)


#连续多个nan
df.iloc[1,3] = None
df.iloc[4,3] = np.nan
df.iloc[3,2] = None
df

#解决连续nan指定填空几个 limit
df.fillna(method=bfill,axis=0,limit=1)

 

1. 创建多层列索引

 

1) 隐式构造

最常见的方法是给DataFrame构造函数的index或者columns参数传递两个或更多的数组

import numpy as np
import pandas as pd
from pandas import DataFrame,Series

#创建了一个索引对象,该索引对象为二层索引
df = DataFrame(np.random.randint(60,100,size=(2,4)),index=[tom,jay],columns=[[qizhong,qimo,qizhong,qimo],[c,m,c,m]])
df

 

 

2) 显示构造pd.MultiIndex.from_

 
  • 使用数组
col=pd.MultiIndex.from_product([[qizhong,qimo],
                                [chinese,math]])


#创建DF对象
df = DataFrame(data=np.random.randint(60,120,size=(2,4)),index=[tom,jay],
         columns=col)
df

2. 多层行索引

 

除了列索引,行索引也能用上述同样的方法创建多层行索引

 

3. 多层索引对象的索引与切片操作

 

1)DataFrame的操作

 
  • 获取所有学生所有科目期末考试成绩
df[qimo]

  获取所有学生期末的math的考试成绩

df.qimo[math]
  • 获取tom期中所有科目的考试成绩
df.qizhong.loc[tom]

  获取tom期末的math成绩

df[qimo].loc[tom,math]

注意:在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!

切片操作

# 总结:
# 访问一列或多列 直接用中括号[columnname]  [[columname1,columnname2...]]
#访问一行或多行  .loc[indexname]
# 访问某一个元素  .loc[indexname,columnname]  获取李四期中的php成绩
# 行切片          .loc[index1:index2]        获取张三李四的期中成绩
# 列切片          .loc[:,column1:column2]    获取张三李四期中的php和c++成



1. 分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法
    - 在df中索引应用在行
    - 在df中切片应用在列

 5. 聚合操作

所谓的聚合操作:平均数,方差,最大值,最小值……

# 计算各个科目期中期末平均成绩
df.mean()

pandas的拼接操作

 

pandas的拼接分为两种:

  • 级联:pd.concat, pd.append

  • 合并:pd.merge, pd.join

 

 

数据分析 02 -Pandas

标签:出错   pen   使用数组   nbsp   localhost   ext   原来   div   concat   

原文地址:https://www.cnblogs.com/TodayWind/p/13771579.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!