Pandas使用(一)

Pandas

1)Pandas介绍

  • 2008年WesMcKinney开发出的库
  • 专门用于数据挖掘的开源python库
  • 以Numpy为基础,借力Numpy模块在计算方面性能高的优势
  • 基于matplotlib,能够简便的画图
  • 独特的数据结构

2)Pandas的优势

  • 增强图表的可读性
  • 便捷的数据处理能力
  • 读取文件方便
  • 封装了Matplptlib、Numpy的画图和计算

3)Pandas的数据结构

Pandas中义工有三种数据结果,分别为:Series、DataFrame和MultiIndex

其中Series是一维数据结果,DataFrame是二维的表格型结构,MultiIndex是三维的数据结构。

1.Series

Series是一个类似于一维数组的数据结果,它能够保存任何类型的数据,比如整数、字符串、负端数等。主要由一组数据和之相关的索引两部分构成。

1.1Series的创建
# 导入pandas
import pandas as pd

pd.Series(data=None, index=None,dtype=None)

  • 参数:

    • data 传入的数据
    • index 索引,必须是唯一的,切与数据的长度相等,如果没有传入索引参数,则默认会自动创建一个从0到N的整数索引
    • dtype 整数的类型
  • 指定内容,默认索引

    pd.Series(np.arange(10))
    # 结果:
    0    0
    1    1
    2    2
    3    3
    4    4
    5    5
    6    6
    7    7
    8    8
    9    9
    dtype: int64
    
  • 指定索引

    pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5])
    
    # 运行结果
    1     6.7
    2     5.6
    3     3.0
    4    10.0
    5     2.0
    dtype: float64
        
    
  • 通过字典数据创建

    color_count = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
    color_count
    
    # 运行结果
    blue       200
    green      500
    red        100
    yellow    1000
    dtype: int64
    
1.2 Series的属性

为了更方便的操作Series对象中的索引和数据,Series中提供了两个属性index和value

  • index
color_count.index

# 结果
Index(['blue', 'green', 'red', 'yellow'], dtype='object')
  • values
color_count.values

# 结果
array([ 200,  500,  100, 1000])

也可以使用索引来获取数据:

color_count[3]

# 结果
1000
2.DataFrame

DataFrame是一个类似于二维数组或表格的对象,既有行索引,又有列索引。

  • 行索引,表明不同行,横向索引,叫index,0轴,axis=0
  • 列索引,表明不同列,总想索引,叫columns,1轴,axis=1
2.1 DataFrame的创建
# 导入pandas
import pandas as pd
pd.DataFrame(data=None,index=None,columns=None)
  • 参数
    • index:行标签,如果没有传入,默认自动创建0-N的整数索引
    • columns:列标签,如果没有传入,默认自动创建0-N的整数索引
  • 通过已有数据创建

创建学生成绩表

# 生成10名同学,5门功课的数据
score = np.random.randint(40, 100, (10, 5))

# 结果
array([[92, 55, 78, 50, 50],
       [71, 76, 50, 48, 96],
       [45, 84, 78, 51, 68],
       [81, 91, 56, 54, 76],
       [86, 66, 77, 67, 95],
       [46, 86, 56, 61, 99],
       [46, 95, 44, 46, 56],
       [80, 50, 45, 65, 57],
       [41, 93, 90, 41, 97],
       [65, 83, 57, 57, 40]])

但是这样的数据形式很难看到存储的是什么的样的数据,可读性比较差!!

问题:如何让数据更有意义的显示

# 使用Pandas中的数据结构
score_df = pd.DataFrame(score)

增加行、列索引

# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]

# 构造列索引序列
students = ['同学{}'.format(i) for i in range(5)]

# 添加索引
data = pd.DataFrame(score, index = students, columns = subjects)
2.2 DataFrame的属性
  • shape 获取形状
  • index 获取行索引列表
  • columns 获取劣索引列表
  • values 获取值
  • T 行列转换
  • head() 默认显示前5行内容,可加入参数
  • tail() 默认显示后5行内容,可加入参数
2.3 修改行列索引值
  • 必须整体修改
stu = ["学生_" + str(i) for i in range(score_df.shape[0])]

# 必须整体全部修改
data.index = stu
  • 重设索引

    • reset_index(drop=False)
      • 设置新的下标索引
      • drop默认为False,不删除原索引,如果为True,删除原索引
    # 重置索引,drop = False
    data.reset_index()
    
    # 重置索引,drop = True
    data.reset_index(drop=True)
    
    
  • 将某列值设置为新的索引

    • set_index(keys,drop=True)
      • keys:列索引名或列索引名称的列表
      • drop:默认为False,不删除原索引,如果为True,删除原索引
    df = pd.DataFrame({'month': [1, 4, 7, 10],
                        'year': [2012, 2014, 2013, 2014],
                        'sale':[55, 40, 84, 31]})
    
       month  sale  year
    0  1      55    2012
    1  4      40    2014
    2  7      84    2013
    3  10     31    2014
    
    

    2、以月份设置新的索引

    df.set_index('month')
           sale  year
    month
    1      55    2012
    4      40    2014
    7      84    2013
    10     31    2014
    

    3、设置多个索引,以年和月份

    df = df.set_index(['year', 'month'])
    df
                sale
    year  month
    2012  1     55
    2014  4     40
    2013  7     84
    2014  10    31
    
3.MultiIndex与Panel
3.1 MultiIndex是三维的数据结构

多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有两个以及以上的索引。

3.2 multiIndex特性

打印刚才的dj的行索引结果

df.index

MultiIndex(levels=[[2012, 2013, 2014], [1, 4, 7, 10]],
           labels=[[0, 2, 1, 2], [0, 1, 2, 3]],
           names=['year', 'month'])

多级或分层索引对象

  • index属性

    • names : levels的名称
    • levles:每个level的元组值
    df.index.names
    # FrozenList(['year','month'])
    
    df.index.levels
    # frozenList([[1,2],[1,4,7,10]])
    
    
3.3 multiIndex的创建
arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
pd.MultiIndex.from_arrays(arrays,names=('number','color'))

# 结果
MultiIndex(levels=[[1, 2], ['blue', 'red']],
           codes=[[0, 0, 1, 1], [1, 0, 1, 0]],
           names=['number', 'color'])

3.4 Panel的创建
  • pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None)

    • 作用:存储三维数组的Panel结构
    • 参数:
      • data:ndarray或者dataframe
      • items:索引或类似数组的对象,axis=0
      • major_axis:索引或类似数组的对象,axis=1
      • minor_axis:索引或类似数组的对象,axis=2
    p = pd.Panel(data=np.arange(24).reshape(4,3,2),
                items=list('ABCD'),
                major_axis=pd.data_range('20191014',periods=3),
                minor_axis=['first','second'])
    
    # 结果
    <class 'pandas.core.panel.Panel'>
    Dimensions: 4 (items) x 3 (major_axis) x 2 (minor_axis)
    Items axis: A to D
    Major_axis axis: 2019-10-14 00:00:00 to 2019-10-17 00:00:00
    Minor_axis axis: first to second
    
    
3.5 查看Panel数据
p[:,:,'first']
p['B',:,:]

4)基本数据操作

1.索引操作

1.1 直接使用行列索引(先列后行)

# 直接使用行列索引名字的方式(先列后行)
data['xx']['1']

1.2结合loc或者iloc使用索引

data.loc['xx':'xx-1','1']

data.iloc[:3,:5]


1.3使用ix组合索引

例如:获取行第一天到第四天,[‘a’,‘b’,‘c’,‘d’]这四个指标的结果

# 使用ix进行下标和名称组合索引
data.ix[0:4,['a','b','c','d']]

# 推荐使用loc和iloc的方式来获取
data.loc[data.index[0:4],['a','b','c','d']]

data.iloc[0:4,data.columns.get_indexer(['a','b','c','d'])]

2.赋值操作

对DataFrame当中的b列进行重新赋值为1

# 直接的修改原来的值
data['b'] = 1
# 或者
data.b = 1
3.排序操作

排序有两种形式,一种是对索引进行排序,另一种是对内容进行排序

3.1 DataFrame排序

  • 使用df.sort_values(by=,ascending=)
    • 单键或者多键进行排序,默认升序
    • ascending=False降序
    • asending=True升序
data = data.sort_values(by='a',ascending=True).head()
data = data.sort_index()

3.2 Series排序

  • 使用df.sort_values(ascending=)
    • series排序只有一列,所以不需要参数
data['b'].sort_values(ascending=True).head()
data['b'].sort_index().head()

5)DataFrame运算

1.算术运算
  • add(other)
data['abc'].add(1)
  • sub(other)
2.逻辑运算

2.1 逻辑运算符号

  • 例如筛选data[‘abc’] > 22 的日期数据

    • 会返回逻辑结果
    data['abc'] > 23
    
    # 结果:
    2018-02-27     True
    2018-02-26    False
    2018-02-23    False
    2018-02-22    False
    2018-02-14    False
    
    • 逻辑判断的结果可以作为筛选的依据
    data[data['abc'] > 23].head()
    
    # 结果就是 data数据中abc列 大于23的前五条数据
    
  • 完成多个逻辑判断

    data[data'abc'] > 23 ) & (data['abc'] < 26).head()
    
    # 结果就是 data数据中abc列大于23并且小于26的前五条数据
    

2.2 逻辑运算函数

  • query(expr)

    • expr:查询字符串

    通过query可以使刚才的运算更加方便简单

    data.query("abc > 23 & abc < 27").head()
    
  • isin(values)

    例如判断’abc’是否为11和22

    # 可以指定值进行判断,从而筛选结果
    data[data['abc'].isin([11,22])]
    
3.统计运算

3.1 直接得出很多统计结果

  • describe

    综合分析:能够直接得出很多统计结果,例如count,mean,std,min,max等

    # 计算平均值、标准差、最大值和最小值等
    data.describe()
    

3.2 统计函数

countNumber of non-NA observations
sumSum of values
meanMean of values
medianArithmetic median of values
minMinimum
maxMaximum
modeMode
absAbsolute Value
prodProduct of values
stdBessel-corrected sample standard deviation
varUnbiased variance
idxmaxcompute the index labels with the maximum
idxmincompute the index labels with the minimum

注意:对于单个函数去进行统计的时候,坐标轴还是按照默认列"columns"(axis=0,default),如果要对行"index",需要指定(axis=1)

  • max()、min()

    # 求出各列的最大值
    data.max()
    
    # 求出各行的最小值
    data.min(1)
    
  • std()、var()

    # 求出各列的方差
    data.std()
    
    # 求出各行的标准差
    data.var(0)
    
  • median()

    中位数为将数据从小到大排序,在最中间的那个数为中位数。如果没有中位数,取中间两个数的平均值。

    data = pd.DataFrame({'demo1' : [2,3,4,5,4,2],
                       'demo2' : [0,1,2,3,4,2]})
    
    # 求出data的中位数
    data.median()
    
    # 结果
    demo1    3.5
    demo2    2.0
    dtype: float64
    
  • idxmax()、idxmin()

    # 求出最大值的位置
    data.idxmax()
    
    # 求出最小值的位置
    data.idxmin()
    
    

3.3 累计统计函数

函数作用
cumsum计算前1/2/3/…/n个数的和
cummax计算前1/2/3/…/n个数的最大值
cummin计算前1/2/3/…/n个数的最小值
cumprod计算前1/2/3/…/n个数的积
  • 排序
# 排序之后进行累计求和
data = data.sort_index()
# 对'abc'列进行求和
sum_ = data['abc'].cumsum()

# 如果需要使用plot函数,可以导入matplotlib
import matplotlib.pyplot as plt

sum_.plot()
plt.show()

4.自定义运算
  • aaply(func,axis=0)
    • func :是自己定义的函数
    • axis = 0 :默认是列,1的时候为行
  • 定义一个队列,最大值 - 最小值的函数
data[['abc','dfg']].apply(lambda x : x.max() - x.min(), axis=0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值