pandas机器学习的工具

pandas官方

Pandas:功能强大的Python数据析具包

最新发布的 最新发布的v0.25.1 最新发布的anaconda cloud 0.25.1 包状态 状态stable(稳定的) 执照 执照BSD(加州大学伯克利分校软件(Berkeley Software Distribution)) 建立状态 travis构建状态 Azure管道构建状态(填充) 覆盖 覆盖(93%) 下载 conda-forge下载(6m全部 total) 小胶质gitter (加入聊天)

它是什么? pandas是一个Python包,提供快速,灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的使用既简单又直观。它旨在成为在Python中进行实际,真实世界数据分析的基础高级构建块。此外,它还有更广泛的目标,即成为任何语言中最强大,最灵活的开源数据分析/操作工具。它已朝着这一目标迈进。

主要特点 以下是熊猫做得很好的一些事情:

  • 轻松处理浮点中的缺失数据 missing data(表示为 NaN)以及非浮点数据

  • 大小可变性:可以从DataFrame和更高维对象插入和删除列

  • 自动和显式数据对齐:对象可以明确地对齐一组标签,或者用户可以简单地忽略标签和让Series,DataFrame等自动对齐数据你计算

  • 功能强大,灵活的分组功能,可对数据集执行拆分应用组合操作,以便聚合和转换数据

  • 可以轻松地将其他Python和NumPy数据结构中的不规则索引数据转换为DataFrame对象

  • 基于智能标签的切片,花式索引和大数据集的子集化

  • 直观的合并和连接数据集

  • 灵活的数据集整形和旋转

  • 轴的分层标记(每个刻度可能有多个标签)

  • 强大的IO工具,用于从平面文件 (CSV和分隔的),Excel文件,数据库加载数据,以及从超快HDF5格式保存/加载数据

  • 时间序列 Time series- 特定功能:日期范围生成和频率转换,移动窗口统计,移动窗口线性回归,日期转换和滞后等。

在哪里得到它

源代码目前托管on GitHub at: https://github.com/pandas-dev/pandas

最新发布版本的二进制安装程序可在Python包索引和conda上获得。

#康达 康达安装熊猫# 									conda install pandas
#或PyPI pip安装pandas;# or PyPI;		 pip install pandas

依赖

NumPy: 1.13.3或更高 python-dateutil:2.5.0或更高版本(标准Python日期时间功能的有用扩展) pytz: 2015.4或更高(pytz - Python的世界时区定义)

搜索:https://github.com/search?utf8=%E2%9C%93&q=pytz&type=Repositories

从源头安装

要从源代码安装pandas,除了上面的常规依赖项外,还需要Cython。可以从pypi安装Cython:
pip安装cython								pip install cython

在pandas目录(克隆git repo后找到此文件的目录)中,执行:
python setup.py安装					python setup.py install

或者在开发模式下安装:python setup.py开发		python setup.py develop

或者,您可以使用,pip如果您希望自动引入所有依赖项(该-e选项用于在开发模式下安装它):
pip install -e .


文档 官方文档托管on PyData.org: https://pandas.pydata.org/pandas-docs/stable 官方文档:https://pandas.pydata.org/pandas-docs/stable/install.html#installing-from-source

背景 2008年pandas开始在AQR(一家定量对冲基金)开展工作,此后一直处于积极发展阶段。

获得帮助 对于使用问题,最好去的地方是StackOverflow。此外,一般问题和讨论也可以在pydata邮件列表上进行。

讨论与发展 大多数开发讨论都在这个回购中的github上进行。此外,pandas-dev邮件列表还可用于专门的讨论或设计问题,Gitter通道可用于快速开发相关问题。

一、Pandas 数据结构

Pandas的数据结构,缺失数据处理,层次化索引等等

1. Series

The page build failed for the `master` branch with the following error:
There was a YAML syntax error on line 5 column 1 in `<unknown>`: `could not find expected ':' while scanning a simple key`. For more information, see https://help.github.com/en/articles/page-build-failed-invalid-yaml-in-data-file.
For information on troubleshooting Jekyll see:
  https://help.github.com/articles/troubleshooting-jekyll-builds
If you have any questions you can contact us by replying to this email.
----------------------邮件
不知道为啥不行哈
imput YAML Front Matter
layout: post
title: "pandas的学习"
date: 2019-09-04
tag: ml

1)Series的创建

  • 通过一维数组创建序列

    import numpy as np, pandas as pd
    arr1 = np.arange(10)
    arr1
    type(arr1)
    s1 = pd.Series(arr1)
    s1
    type(s1)
      
    
  • 通过字典的方式创建序列

    dic1 = {'a':10,'b':20,'c':30,'d':40,'e':50}
    dic1
    type(dic1)
    s2 = pd.Series(dic1)
    s2
    type(s2)
    
  • 通过DataFrame中的某一行或某一列创建序列

  • 带有独特索引的Series数据

    seriesdata_1=pd.Series(['Profession','student','bechelor','professor','informatics developer'],index=['Name','Linker','Hamacher','Schuhmacher','Heintze'])
    
  • s1.values 获取数据

  • s1.index 获取索引

2) Series数据过滤

seriesdata_2=pd.Series([34,-4,-45,-37,32,9,1,3],index=['a','d','e','y','f','t','u','o'])

seriesdata_2
Out[34]: 
a 34
d -4
e -45
y -37
f 32
t 9
u 1
o 3
dtype: int64

seriesdata_2[seriesdata_2>1]
Out[35]: 
a 34
f 32
t 9
o 3
dtype: int64

3) Series数据计算

seriesdata_2=pd.Series([34,-4,-45,-37,32,9,1,3],index=['a','d','e','y','f','t','u','o'])

seriesdata_2*3
Out[37]: 
a 102
d -12
e -135
y -111
f 96
t 27
u 3
o 9
dtype: int64

np.sin(seriesdata_2)
Out[38]: 
a 0.529083
d 0.756802
e -0.850904
y 0.643538
f 0.551427
t 0.412118
u 0.841471
o 0.141120
dtype: float64

4) 应用字典函数

  • in

    datas_pys=pd.Series(range(4),index=['i','want','to','do'])
      
    datas_pys
    Out[35]: 
    i 0
    want 1
    to 2
    do 3
    dtype: int32
      
    'want' in datas_pys
    Out[36]: True
      
      
    
  • updata 对号更改 index相同,不能添加

    datas_pys.update(pd.Series([2,3,4],index=['want','to','do']))
      
    datas_pys
    Out[57]: 
    i 0
    want 2
    to 3
    do 4
    dtype: int32
      
    
  • append 末尾添加

    s1 = pd.Series([1, 2, 3])
      
    In [59]: s2 = pd.Series([4, 5, 6])
      
    In [60]: s3 = pd.Series([4, 5, 6], index=[3,4,5])
      
    s1.append(s2)
    Out[61]: 
    0 1
    1 2
    2 3
    0 4
    1 5
    2 6
    dtype: int64
      
    s1.append(s3)
    Out[62]: 
    0 1
    1 2
    2 3
    3 4
    4 5
    5 6
    dtype: int64
      
    s1.append(s2, ignore_index=True)
    # 忽略索引,重新编号
    Out[63]: 
    0 1
    1 2
    2 3
    3 4
    4 5
    5 6
    dtype: int64
      
      
    

5) 检测数据缺失(重要)

  • pd.isnull(series) 是就是True / series.isnull()

    dit_113={'lin':139,'zhang':134,'wang':173,'tan':None}
    serie_123=pd.Series(dit_113)
      
    serie_123
    Out[81]: 
    lin 139.0
    tan NaN
    wang 173.0
    zhang 134.0
    dtype: float64
      
    pd.isnull(serie_123)
    Out[82]: 
    lin False
    tan True
    wang False
    zhang False
    dtype: bool
      
      
    
  • pd.notnull(series) 这个可以 / series.notnull()

    pd.notnull(serie_123)
    Out[83]: 
    lin True
    tan False
    wang True
    zhang True
    dtype: bool
      
    serie_123.notnull()
    Out[85]: 
    lin       True
    tan      False
    wang      True
    zhang     True
    dtype: bool
      
      
    

6) Series 索引

  • 修改索引

    dit_113={'lin':139,'zhang':134,'wang':173,'tan':None}
    serie_123=pd.Series(dit_113)
    serie_123.index
    Out[87]: Index(['lin', 'tan', 'wang', 'zhang'], dtype='object')
      
    In [88]: serie_123.index=['lin', 'tan', 'shan', 'zhang']
      
    In [90]: serie_123
    Out[90]: 
    lin 139.0
    tan NaN
    shan 173.0
    zhang 134.0
    dtype: float64
      
      
    
  • 索引重建

    reindex方法可以为series和dataframe添加或者删除索引。 方法:serise.reindex()、dataframe.reindex() 如果新添加的索引没有对应的值,则默认为nan。如果减少索引,就相当于一个切片操作。

    Seriestest_1=pd.Series([10,-34,-89,36,50],index=['a','b','c','d','e'])
      
    In [5]: Seriestest_1
    Out[5]: 
    a 10
    b -34
    c -89
    d 36
    e 50
    dtype: int64
      
    Seriestest_2=Seriestest_1.reindex(['c','b','d','a','e','f'],fill_value=0)
      
    In [11]: Seriestest_2
    Out[11]: 
    c -89
    b -34
    d 36
    a 10
    e 50
    f 0
    dtype: int64
      
      
      
    

    使用ffill 可以自动向前 nan= [0,2] 23 = [3,6] ;22 = [7,8];34= [9,10]

    bfill 函数和向后补充缺失索引。

    23= [0,3];22 = [4,7];34= [8,9] ; nan= {10}

    testarray1=pd.Series([23,22,34],index=[3,7,9])
    In [10]: test_12=testarray1.reindex(range(11),method='ffill')
      
    In [11]: test_12
    Out[11]: 
    0 NaN
    1 NaN
    2 NaN
    3 23.0
    4 23.0
    5 23.0
    6 23.0
    7 22.0
    8 22.0
    9 34.0
    10 34.0
    dtype: float64
      
    test_12=testarray1.reindex(range(11),method='bfill')
      
    In [13]: test_12
    Out[13]: 
    0 23.0
    1 23.0
    2 23.0
    3 23.0
      
      
    4 22.0
    5 22.0
    6 22.0
    7 22.0
      
      
    8 34.0
    9 34.0
    10 NaN
    dtype: float64
      
      
    

7) Series 删除

  • drop

    In [46]: Seriestest_1=pd.Series([233,356,997],index=['as','a','sample'])
    In [47]: Seriestest_1
    Out[47]: 
    as 233
    a 356
    sample 997
    dtype: int64
      
    Seriestest_1.drop('a')
    Out[95]: 
    as        233
    sample    997
    dtype: int64
    # drop函数或者说方法返回的是一个在指定轴上删除指定值的新对象
      
      
    

2. DataFrame

1)DataFrame 的创建

  • 通过二维数组创建数据框

    arr2 = np.array(np.arange(12)).reshape(4,3)
    arr2
    type(arr2)
    df1 = pd.DataFrame(arr2)
    df1
    type(df1)
      
      
    
  • 通过字典的方式创建数据框

    以下以两种字典来创建数据框,一个是字典列表,一个是嵌套字典。
    dic2 = {'a':[1,2,3,4],'b':[5,6,7,8],
    'c':[9,10,11,12],'d':[13,14,15,16]}
    dic2
    type(dic2)
    df2 = pd.DataFrame(dic2)
    df2
    type(df2)
      
    dic3 = {'one':{'a':1,'b':2,'c':3,'d':4},
    'two':{'a':5,'b':6,'c':7,'d':8},
    'three':{'a':9,'b':10,'c':11,'d':12}}
    dic3
    type(dic3)
    df3 = pd.DataFrame(dic3)
    df3
    type(df3)
      
      
    
  • 指定标签

    frame_1=pd.DataFrame(np.arange(9).reshape(3,3),index=['row1','row2','row3'],columns=['one','two','three'])
      
    frame_1
    Out[19]: 
    one two three
    row1 0 1 2
    row2 3 4 5
    row3 6 7 8
      
      
      
    
  • 通过数据框的方式创建数据框

    df4 = df3[['one','three']]
    df4
    type(df4)
    s3 = df3['one']
    s3
    type(s3)
      
      
    
  • df.values 获取数据框的值

2) DataFrame 索引

  • df.columns 列数据索引

    # 获取列数据
    df[列标签]
      
      
    
  • df.index 行数据索引

    # 获取行数据
    df.loc[行标签]
      
      
    
  • 索引修改

    df.index=[]
    # 赋新值
      
      
    
  • 添加新列

    df.[新列标签]=[] # 给新标签赋数据
      
      
    
  • 数据框的索引修改

    reindex可以任意删除,添加,交换行列

    • 增加索引

      frame_1=pd.DataFrame(np.arange(9).reshape(3,3),index=['row1','row2','row3'],columns=['one','two','three'])
          
      frame_1
      Out[19]: 
      	one two three
      row1 0 1 2
      row2 3 4 5
      row3 6 7 8
          
      frame2=frame_1.reindex(['row0','row1','row2','row3'])
          
      frame2
      Out[21]: 
      	one two three
      row0 NaN NaN NaN
      row1 0.0 1.0 2.0
      row2 3.0 4.0 5.0
      row3 6.0 7.0 8.0
          
          
      
    • reindex 修改列

      frame3=frame2.reindex(columns=['four','three'])
          
      frame3
      Out[29]: 
      	four three
      row0 NaN NaN
      row1 NaN 2.0
      row2 NaN 5.0
      row3 NaN 8.0
          
          
      
    • 同时修改列和行索引(必须之前的表有,可以做)

      frame4=frame_1.reindex(['row1','row2','row3','row4'],columns=['five','three','six'])
          
      In [32]: frame_1
      Out[32]: 
      one two three
      row1 0 1 2
      row2 3 4 5
      row3 6 7 8
          
      In [33]: frame4
      Out[33]: 
      five three six
      row1 NaN 2.0 NaN
      row2 NaN 5.0 NaN
      row3 NaN 8.0 NaN
      row4 NaN NaN NaN
          
          
      
  • loc 函数修改数据框行索引与列

    frame5=frame_1.reindex(columns=['one','four','two','three'])
      
    In [36]: frame5
    Out[36]: 
    	one four two three
    row1 0 NaN 1 2
    row2 3 NaN 4 5
    row3 6 NaN 7 8
      
    In [40]: frame5['four']=pd.Series([34,56,78],index=['row1','row2','row3'])
      
    In [41]: frame5
    Out[41]: 
    one four two three
    row1 0 34 1 2
    row2 3 56 4 5
    row3 6 78 7 8
      
    In [44]: frame5.loc[['row2','row1','row3'],['one','two','four','three']]
    Out[44]: 
    one two four three
    row2 3 4 56 5
    row1 0 1 34 2
    row3 6 7 78 8
      
      
      
    

3) DataFrame 赋值 / 删除

  • 使用 Series 赋值

    # 可以精确地赋值到行列交叉位,没有指定的行列交叉位不会被赋值,将会以NAN的形式显示。
      
    val_Series=pd.Series([0,1,1],index=[6,7,9])
    In [19]: framesample_1['Profit']=val_Series
      
    framesample_1
    Out[20]: 
    SalesQuantity Seller Sales Profit
    5 213 zhanghui 12365 NaN
    6 305 dongyibo 34563 0.0
    7 452 yangqian 45673 1.0
    8 302 liujuntao 23461 NaN
    9 190 zhangshanshan 89034 1.0
      
      
      
    
    # 为不存在的列赋值会产生新的列
    framesample_1['loss']=pd.Series([165,0,0,34,0],index=range(5,10,1))
      
    In [22]: framesample_1
    Out[22]: 
    SalesQuantity Seller Sales Profit loss
    5 213 zhanghui 12365 NaN 165
    6 305 dongyibo 34563 0.0 0
    7 452 yangqian 45673 1.0 0
    8 302 liujuntao 23461 NaN 34
    9 190 zhangshanshan 89034 1.0 0
      
      
    
  • del df[标签] 删除列

  • df.drop()

    Drop函数删除指定值时必须指定轴,如果不指定轴,默认零轴。

    np.random.rand(4,4)全是正的

    行是 axis= 0

    In [53]: Dataframe_1_test=pd.DataFrame(np.floor(np.random.randn(4,4)),index=['xu','liu','zhang','feng'],columns=['stufe','klasse','degree','group'])
      
    In [54]: Dataframe_1_test
    Out[54]: 
    stufe klasse degree group
    xu -1.0 0.0 -1.0 1.0
    liu 0.0 -2.0 -1.0 -1.0
    zhang 0.0 -3.0 -2.0 1.0
    feng -1.0 0.0 -1.0 0.0
      
    In [57]: Dataframe_1_test.drop(['stufe','klasse'],axis=1)
    Out[57]: 
    degree group
    xu -1.0 1.0
    liu -1.0 -1.0
    zhang -2.0 1.0
    feng -1.0 0.0
      
    In [59]: Dataframe_1_test.drop(['xu','feng'])
    Out[59]: 
    stufe klasse degree group
    liu 0.0 -2.0 -1.0 -1.0
    zhang 0.0 -3.0 -2.0 1.0
      
    In [60]: Dataframe_1_test.drop(['liu'])
    Out[60]: 
    stufe klasse degree group
    xu -1.0 0.0 -1.0 1.0
    zhang 0.0 -3.0 -2.0 1.0
    feng -1.0 0.0 -1.0 0.0
      
      
    
  • df.T 数据框转置

4) 标签添加名字

  • 列标签

    df.columns.name ='Name'
      
      
    
  • 行标签

    df.index.name = 'Name'
      
      
    

3. 索引与选取

1) Series 的索引

  • 按默认索引检索

    Testser_1=pd.Series([23,43,789,674,90,65],index=['apple','pear','persimmon','watermelon','strawberry','orange'])
      
    In [7]: Testser_1
    Out[7]: 
    apple 23
    pear 43
    persimmon 789
    watermelon 674
    strawberry 90
    orange 65
    dtype: int64
      
    In [9]: Testser_1[2:4]
    Out[9]: 
    persimmon 789
    watermelon 674
    dtype: int64
      
      
    
  • 按给定索引切片

    In [25]: Testser_1['apple':'watermelon']
    Out[25]: 
    apple 23
    pear 43
    persimmon 789
    watermelon 674
    dtype: int64
      
      
    
    In [26]: Testser_1[['apple','watermelon']]
    Out[26]: 
    apple 23
    watermelon 674
    dtype: int64
      
      
    
  • 单个索引

    # 按默认和按给定索引(也叫标签)均可检索
    In [27]: Testser_1['apple']
    Out[27]: 23
      
    In [28]: Testser_1[0]
    Out[28]: 23
      
      
    
  • bool值索引

    In [30]: Testser_1[Testser_1>100]
    Out[30]: 
    persimmon 789
    watermelon 674
    dtype: int64
      
      
    

2) Series 赋值

# 选取赋值
Testser_1['apple':'watermelon']=[112,22,32,42]

In [32]: Testser_1
Out[32]: 
apple 112
pear 22
persimmon 32
watermelon 42
strawberry 90
orange 65
dtype: int64

# 选取广播赋值
In [34]: Testser_1['apple':'watermelon']=56

In [35]: Testser_1
Out[35]: 
apple 56
pear 56
persimmon 56
watermelon 56
strawberry 90
orange 65
dtype: int64

# 等同于[2:3]
In [37]: Testser_1[[2,3]]=34

In [38]: Testser_1
Out[38]: 
apple 56
pear 56
persimmon 34
watermelon 34
strawberry 90
orange 65
dtype: int64

# 单个索引赋值
In [39]: Testser_1['apple']=34

In [40]: Testser_1
Out[40]: 
apple 34
pear 56
persimmon 34
watermelon 34
strawberry 90
orange 65
dtype: int64


3) DataFrame 的索引

  • 列索引选取

    In [5]: Data=pd.DataFrame(np.arange(16).reshape(4,4),index=('one','two','three','four'),columns=('wir','sie','ihr','ich'))
      
    In [6]: Data
    Out[6]: 
    wir sie ihr ich
    one 0 1 2 3
    two 4 5 6 7
    three 8 9 10 11
    four 12 13 14 15
      
    # 指定列索引
    In [7]: Data['wir']
    Out[7]: 
    one 0
    two 4
    three 8
    four 12
    Name: wir, dtype: int32
      
    In [8]: Data[['wir','ihr']]
    Out[8]: 
    wir ihr
    one 0 2
    two 4 6
    three 8 10
    four 12 14
      
      
    
  • bool值索引

    In [23]: Data>8
    Out[23]: 
    wir sie ihr ich
    one False False False False
    two False False False False
    three False True True True
    four True True True True
    In [25]: Data[Data>8]=0
      
      
    
  • bool值选区

    # 用“bool”值来检索时只能先检索出列数据,然后再与设定值比较,得出bool值Series
    In [22]: Data[Data['ihr']>6]
    Out[22]: 
    wir sie ihr ich
    three 8 9 10 11
    four 12 13 14 15
      
    Data[pd.Series([True,False,True,False],index=['one','two','three','four'])]
    Out[44]: 
           wir  sie  ihr  ich
    one      0    1    2    3
    three    8    9   10   11
      
      
    
  • bool值选区赋值

    In [25]: Data[Data>8]=0
      
    In [26]: Data
    Out[26]: 
    wir sie ihr ich
    one 0 1 2 3
    two 4 5 6 7
    three 8 0 0 0
    four 0 0 0 0
      
      
    
  • loc函数能指定行列索引进行检索

    # 指定行索引
    In [31]: Data.loc['two']
    Out[31]: 
    wir 4
    sie 5
    ihr 6
    ich 7
    Name: two, dtype: int32
      
    # 指定行列索引
    In [33]: Data.loc['four','wir':'ihr']
    Out[33]: 
    wir 12
    sie 13
    ihr 14
    Name: four, dtype: int32
      
    In [34]: Data.loc['four',['wir','ihr']]
    Out[34]: 
    wir 12
    ihr 14
    Name: four, dtype: int32
      
    Data.loc[['one','four'],['wir','ich']]
    Out[136]: 
          wir  ich
    one     0    3
    four   12   15
      
    In [35]: Data.loc['one':'three','ich']
    Out[35]: 
    one 3
    two 7
    three 11
    Name: ich, dtype: int32
      
    In [38]: Data.loc['one':,'wir']
    Out[38]: 
    one 0
    two 4
    three 8
    four 12
    Name: wir, dtype: int32
      
    # bool值索引
    In [45]: Data.loc[Data.wir>5,:'ich']
    Out[45]: 
    wir sie ihr ich
    three 8 9 10 11
    four 12 13 14 15
      
      
    

4) 修改索引

  • data.reindex( index=[ ] ,columns=[ ] )

    In [50]: Data
    Out[50]: 
    	wir sie ihr ich
    one 0 1 2 3
    two 4 5 6 7
    three 8 9 10 11
    four 12 13 14 15
      
    # 修改行索引
    In [51]: Data.reindex(index=['one','three','four','two'])
    Out[51]: 
    	wir sie ihr ich
    one 0 1 2 3
    three 8 9 10 11
    four 12 13 14 15
    two 4 5 6 7
      
    # 修改列索引
    In [52]: Data.reindex(columns=['wir','ihr','sie','ich'])
    Out[52]: 
    wir ihr sie ich
    one 0 2 1 3
    two 4 6 5 7
    three 8 10 9 11
    four 12 14 13 15
      
      
    
    xs方法:根据标签选取单行和单列,返回‘Series’
    In [66]: Data.xs('one')
    Out[66]: 
    wir 0
    sie 1
    ihr 2
    ich 3
    Name: one, dtype: int32
      
      
    

5) DataFrame 选取数据

  • data.xs()

    xs方法:根据标签选取单行和单列,返回‘Series’
      
    # 默认 axis = 0
    In [66]: Data.xs('one')
    Out[66]: 
    wir 0
    sie 1
    ihr 2
    ich 3
    Name: one, dtype: int32
      
    # 选取列需指定轴
    In [69]: Data.xs('sie',axis=1)
    Out[69]: 
    one 1
    two 5
    three 9
    four 13
    Name: sie, dtype: int32
      
      
    
  • data.get_value()

    # get_value 方法得到数据框内单个值
    Data.get_value('three','ihr')
    Out[72]: 10
      
    # 获取单个值效果相同
    Data.loc['three','ihr']
      
      
    

二、Pandas 计算

  1. Series

1) 加法

Series数据相加必须按照索引一一相加,如果索引不能配对,将返回空值。

Se1=pd.Series([2.3,78,2.5,3.8],index=['as','a','pupil','and'])
Se2=pd.Series([2,7.7,2.1,3.3,9,12],index=['as','a','studen','teacher','and','or'])
tesseq_1=Se1+Se2

In [7]: tesseq_1
Out[7]: 
a 85.7
and 12.8
as 4.3
or NaN
pupil NaN
studen NaN
teacher NaN
dtype: float64


2) 减法

In [32]: S1=pd.Series([3,6,9])
In [34]: S2=pd.Series([4,3.2,3])
S3=S1-S2

S3
Out[38]: 
0   -1.0
1    2.8
2    6.0
dtype: float64


3) 乘法

S4=S1*S2

S4
Out[40]: 
0    12.0
1    19.2
2    27.0
dtype: float64


4) 除法

S5=S1/S2

S5
Out[42]: 
0    0.750
1    1.875
2    3.000
dtype: float64


2. DataFrame

1) 加法

DataFrame数据相加必须按照行索引和列一一相加,如果索引和列不能配对(也就是两个数据的行列标签不相等时),将返回空值。(先行索引匹配,然后在进行列匹配)

In [22]: add1=pd.DataFrame(np.arange(9).reshape(3,3),index=['ein','zwei','drei'],columns=list('bde'))

In [23]: add2=pd.DataFrame(np.arange(12).reshape(4,3),index=['zwei','sechs','drei','seven'],columns=list('bef'))
In [26]: add1
Out[26]: 
b d e
ein 0 1 2
zwei 3 4 5
drei 6 7 8

In [27]: add2
Out[27]: 
b e f
zwei 0 1 2
sechs 3 4 5
drei 6 7 8
seven 9 10 11

In [24]: Test_add=add1+add2

In [25]: Test_add
Out[25]: 
b d e f
drei 12.0 NaN 15.0 NaN
ein NaN NaN NaN NaN
sechs NaN NaN NaN NaN
seven NaN NaN NaN NaN
zwei 3.0 NaN 6.0 NaN


2) 减法

Frame1=pd.DataFrame([[2,2,1],[1,1,3],[0,2,3]],index=['Nr1','Nr2','Nr3'],columns=['mon','tue','wen'])
Frame2=pd.DataFrame([[1,3,1],[0,1,2],[2,0,1]],index=['Nr1','Nr2','Nr3'],columns=['mon','tue','wen'])

Frame3=Frame1-Frame2

In [46]: Frame3
Out[46]: 
mon tue wen
Nr1 1 -1 0
Nr2 1 0 1
Nr3 -2 2 2


3) 乘法

In [47]: Frame4=Frame1*Frame2

In [48]: Frame4
Out[48]: 
mon tue wen
Nr1 2 6 1
Nr2 0 1 6
Nr3 0 0 3


4) 除法

In [49]: Frame5=Frame1/Frame2

In [50]: Frame5
Out[50]: 
mon tue wen
Nr1 2.000000 0.666667 1.0
Nr2 inf 1.000000 1.5
Nr3 0.000000 inf 3.0


  • df.sum()

    只要不是整行都是NaN值,python自动排除NAN值然后进行计算。通过skipna可以禁止该功能。
    df.sum(axis=1,skipan=False)
      
      
    
  • df.idxmax() 求出每列最大值对应的索引

  • df.idxmin 求出每行最小值索引,空值不参与比较。

    #修改skipna的默认值”True”,可以修改NaN值自动忽略功能。
    df.idxmin(axis=1,skipna=False)
      
      
    
  • df.cumsum()

    按列累计加,遇到NaN值自动忽略,不参与运算。
    df.cumsum(1) # 按行
      
      
    
  • df.describe() 分位数

    ount	3.000000	3.000000	3.000000
    mean	4.666667	3.333333	3.333333
    std	6.429101	0.577350	2.081666
    min	0.000000	3.000000	1.000000
    25%	1.000000	3.000000	2.500000
    50%	2.000000	3.000000	4.000000
    75%	7.000000	3.500000	4.500000
    max	12.000000	4.000000	5.000000
      
    

3. DataFrame 与 Series 运算

数据框与Serie是之间的加减运算分为

沿行和沿列运算的。(对好索引,计算)

匹配列索引,沿行运算

Frame1=pd.DataFrame([[2,2,1],[1,1,3],[0,2,3]],index=['Nr1','Nr2','Nr3'],columns=['mon','tue','wen'])

In [4]: Frame1
Out[4]: 
mon tue wen
Nr1 2 2 1
Nr2 1 1 3
Nr3 0 2 3
In [7]: S1=pd.Series([2,2,1],index=['mon','tue','wen'])

In [8]: Frame1-S1
Out[8]: 
mon tue wen
Nr1 0 0 0
Nr2 -1 -1 2
Nr3 -2 0 2
# 数据框沿着行一行行的被Series减去。这种计算方法在Python里被称作广播。

In [9]: S1=pd.Series([2,2,1],index=['mon','wen','fri'])

In [10]: Frame1-S1
Out[10]: 
fri mon tue wen
Nr1 NaN 0.0 NaN -1.0
Nr2 NaN -1.0 NaN 1.0
Nr3 NaN -2.0 NaN 1.0

# 如果某个索引不出现在在数据框的列索引或Series的索引里就会出现NaN。这对数据分析也是不利的,因此要求我们在设置索引时一定要一一对应。


 In [11]: S2=pd.Series([2,1,0],index=['Nr1','Nr2','Nr3'])
In [15]: Frame1.sub(S2,axis=0)
Out[15]: 
mon tue wen
Nr1 0 0 -1
Nr2 0 0 2
Nr3 0 2 3
# 乘法和除法可以按照.Multiply 和.devide方法  #?


加载numpy,pandas和Series,DataFrame。
生成一个3乘3的DataFrame,命名为frame,用frame的第二列生成Series,命名为series1

import numpy as np,pandas as pd
from pandas import Series,DataFrame
frame = DataFrame(np.arange(9).reshape(3,3),columns = list('abc'),index = ['one','two','three'])
series1 = frame['b']


加法运算。
frame.add(series1,axis=0)
减法运算。
frame.sub(series1,axis=0)
乘法运算。
frame.mul(series1,axis=0)
除法运算。
frame.div(series1,axis=0)

4. DataFrame 运用函数

  • frame.apply()

    用在dataframe上,用于对row或者column进行计算

    frame12=pd.DataFrame(np.arange(12).reshape(4,3),index=['r1','r2','r3','r4'],columns=['c1','c2','c3'])
      
    In [18]: frame12
    Out[18]: 
    c1 c2 c3
    r1 0 1 2
    r2 3 4 5
    r3 6 7 8
    r4 9 10 11
      
    f=lambda x:x.max()-x.min()
    In [24]: frame12.apply(f)
    Out[24]: 
    c1 9
    c2 9
    c3 9
    dtype: int64
      
    In [25]: frame12.apply(f,axis=1)
    Out[25]: 
    r1 2
    r2 2
    r3 2
    r4 2
    dtype: int64
      
      
    
    frame11=pd.DataFrame(np.arange(12).reshape(3,4),index=['r1','r2','r3'],columns=['c1','c2','c3','c4'])
      
    def table_extrem (x):
    	return pd.Series([x.min(),x.max()],index=['min','max'])
      	
    例子1:
    In [14]: table_extrem(frame11)
    Out[14]: 
    min c1 0
    c2 1
    c3 2
    c4 3
    dtype: int32
    max c1 8
    c2 9
    c3 10
    c4 11
    dtype: int32
    dtype: object
      
    例子2.
    In [15]: frame11.apply(table_extrem)
    Out[15]: 
    c1 c2 c3 c4
    min 0 1 2 3
    max 8 9 10 11
      
      
    
  • frame.applymap()

    用于dataframe上,是元素级别的操作

  • frame.min()

  • frame.max()

不做声明,默认轴为‘0’意思为沿行标签操作

  • DataFrame 的格式化(保留2位小数)

    In [16]: frame11=pd.DataFrame(np.random.randn(3,4),index=['r1','r2','r3'],columns=['c1','c2','c3','c4'])
      
    In [17]: frame11
    Out[17]: 
    c1 c2 c3 c4
    r1 -2.061714 0.584658 -0.540976 0.090904
    r2 -0.517271 -0.077818 0.163807 0.418174
    r3 0.321513 0.769480 2.131075 -0.535560
      
    In [18]: formatierung=lambda x:'%.2f' % x
      
    In [19]: frame11.applymap(formatierung)
    Out[19]: 
    c1 c2 c3 c4
    r1 -2.06 0.58 -0.54 0.09
    r2 -0.52 -0.08 0.16 0.42
    r3 0.32 0.77 2.13 -0.54
      
      
    

三、排序和排名

1. Series 排序

  • series.sort_index()

    # 默认 ascending=False
    In [120]: project_1=pd.Series(np.arange(1,5),index=['a','z','e','f'])
      
    In [121]: project_1
    Out[121]: 
    a 1
    z 2
    e 3
    f 4
    dtype: int32
      
    In [122]: project_1.sort_index()
    Out[122]: 
    a 1
    e 3
    f 4
    z 2
    dtype: int32
      
      
    
  • series.sort_values() 值排序

2. DataFrame 排序

排序可以对数据值本身和标签进行操作。而排名通常对数据本身操作。

  • 行标签排序

    DataFrame_12=pd.DataFrame(np.arange(8).reshape(2,4),index=['r1','r2'],columns=['ted','lie','qiu','send'])
      
    In [125]: DataFrame_12.sort_index()
    Out[125]: 
    ted lie qiu send
    r1 0 1 2 3
    r2 4 5 6 7
      
      
    
  • 列标签排序

    DataFrame_12.sort_index(axis=1)
    Out[126]: 
    lie qiu send ted
    r1 1 2 3 0
    r2 5 6 7 4
      
      
    
  • 值排序

    Dataffdic=pd.DataFrame({'liu':[-1,0,2,-3],'wang':[3,2,-5,7],'jiang':[1,0,1,5]})
      
    In [19]: Dataffdic
    Out[19]: 
    jiang liu wang
    0 1 -1 3
    1 0 0 2
    2 1 2 -5
    3 5 -3 7
      
    Dataffdic.sort_values(by='liu')
    Out[22]: 
    jiang liu wang
    3 5 -3 7
    0 1 -1 3
    1 0 0 2
    2 1 2 -5
      
      
    

3. Series 排名

In [1]: import numpy as np 

In [2]: import pandas as pd

In [3]: Series_1=pd.Series(np.array([3,8,34,33]),index=['r1','r2','r3','r4'])

In [4]: Frame_1=pd.DataFrame(np.array([[3,2,5,0],[7,4,12,13],[1,0,1,-3],[3,6,2,0]]),index=['r1','r2','r3','r4'],columns=['a','b','c','d'])


ascending 默认为 True

1) average 法

In [6]: Series_1.rank(method='average')
Out[6]: 
r1 1.0
r2 2.0
r3 4.0
r4 3.0
dtype: float64


2) min 法

In [8]: Series_1.rank(method='min')
Out[8]: 
r1 1.0
r2 2.0
r3 4.0
r4 3.0
dtype: float64


3) max 法

In [7]: Series_1.rank(method='max')
Out[7]: 
r1 1.0
r2 2.0
r3 4.0
r4 3.0
dtype: float64


4) first 法

In [9]: Series_1.rank(method='first')
Out[9]: 
r1 1.0
r2 2.0
r3 4.0
r4 3.0
dtype: float64


4. DataFrame 排名

# 按列排名 axis 默认为 0
# 按行排名 axis=1
In [14]: Frame_1.rank(method='first')
Out[14]: 
a b c d
r1 2.0 2.0 3.0 2.0
r2 4.0 3.0 4.0 4.0
r3 1.0 1.0 1.0 1.0
r4 3.0 4.0 2.0 3.0

In [15]: Frame_1.rank(method='average')
Out[15]: 
a b c d
r1 2.5 2.0 3.0 2.5
r2 4.0 3.0 4.0 4.0
r3 1.0 1.0 1.0 1.0
r4 2.5 4.0 2.0 2.5

In [16]: Frame_1.rank(method='min')
Out[16]: 
a b c d
r1 2.0 2.0 3.0 2.0
r2 4.0 3.0 4.0 4.0
r3 1.0 1.0 1.0 1.0
r4 2.0 4.0 2.0 2.0

In [17]: Frame_1.rank(method='max')
Out[17]: 
a b c d
r1 3.0 2.0 3.0 3.0
r2 4.0 3.0 4.0 4.0
r3 1.0 1.0 1.0 1.0
r4 3.0 4.0 2.0 3.0


四、带有重复轴索引

  • DataFrame 重复轴索引

    In [3]: framne_repeat=pd.DataFrame(np.arange(16).reshape(4,4),index=['r1','r2','r3','r1'],columns=['a','b','b','c'])
      
    In [4]: framne_repeat
    Out[4]: 
    a b b c
    r1 0 1 2 3
    r2 4 5 6 7
    r3 8 9 10 11
    r1 12 13 14 15
      
    In [5]: framne_repeat['b']
    Out[5]: 
    b b
    r1 1 2
    r2 5 6
    r3 9 10
    r1 13 14
    In [8]: framne_repeat.loc['r1']
    Out[8]: 
    a b b c
    r1 0 1 2 3
    r1 12 13 14 15
      
      
    
  • Series 重复轴索引

    In [7]: testserie_1=pd.Series(np.array([1,2,3,9,10,3]),index=['a','b','a','d','e','a'])
      
    In [8]: testserie_1
    Out[8]: 
    a 1
    b 2
    a 3
    d 9
    e 10
    a 3
    dtype: int32
      
    In [9]: testserie_1['a']
    Out[9]: 
    a 1
    a 3
    a 3
    dtype: int32
      
      
    
  • is_unique()

    # 通过is_unique 函数来判断是否存在重复轴索引
    In [3]: testserie_1=pd.Series(np.array([1,2,3,9,10,3]),index=['a','b','a','d','e','a'])
      
    In [4]: testserie_1.is_unique
    Out[4]: False
      
      
    

五、去重,值计数值资格判断

  • Series去除重复项目 series.unique()

  • 对数组排序 array.sort()

  • value_counts() 求出指定元素出现的次数

    # Series value_count()
    series.value_counts()
    pd.value_counts(series)
    也可以不把计算内容做降序处理:
    pd.value_counts(series,sort=False)
      
      
    
    # DataFrame value_count()
    dataFrame_1
    Out[69]: 
         c1   c2   c3   c4
    r1  0.0  1.0  2.0  3.0
    r2  NaN  2.0  3.6  0.9
    r3  1.2  4.0  6.0  7.0
    r4  3.4  7.9  0.4  8.0
      
    dataFrame_1.fillna(0)
    Out[71]: 
         c1   c2   c3   c4
    r1  0.0  1.0  2.0  3.0
    r2  0.0  2.0  3.6  0.9
    r3  1.2  4.0  6.0  7.0
    r4  3.4  7.9  0.4  8.0
      
    dataFrame_2=dataFrame_1.fillna(0)
      
    result=dataFrame_2.apply(pd.value_counts).fillna(0)
      
    result
    Out[74]: 
          c1   c2   c3   c4
    0.0  2.0  0.0  0.0  0.0
    0.4  0.0  0.0  1.0  0.0
    0.9  0.0  0.0  0.0  1.0
    1.0  0.0  1.0  0.0  0.0
    1.2  1.0  0.0  0.0  0.0
    2.0  0.0  1.0  1.0  0.0
    3.0  0.0  0.0  0.0  1.0
    3.4  1.0  0.0  0.0  0.0
    3.6  0.0  0.0  1.0  0.0
    4.0  0.0  1.0  0.0  0.0
    6.0  0.0  0.0  1.0  0.0
    7.0  0.0  0.0  0.0  1.0
    7.9  0.0  1.0  0.0  0.0
    8.0  0.0  0.0  0.0  1.0
      
      
    
  • series.isin([list])

    # 判断列表中内容是否在序列中,返回一个布尔 Series
      
      
    
  • df.fillna(100) 用100填充缺失值

  • df.drop_duplicates

    # fr21.drop_duplicates(subset=None, keep='first', inplace=False)
      
    fr21=pd.DataFrame([[1,2,3,2,4],[1,3,4,3,4],[1,6,3,8,9],[1,3,4,3,4],[7,3,1,5,4]])
      
    fr21
    	0	1	2	3	4
    0	1	2	3	2	4
    1	1	3	4	3	4
    2	1	6	3	8	9
    3	1	3	4	3	4
    4	7	3	1	5	4
      
    fr21.drop_duplicates([0,4],keep='first')#第一个参数subset通过选取列确定判断重复的所在子集,第二个参数keep,确定保留重复数据的第一次出现,
    #还是保留重复数据的最后一次出现,或者所有的重复数据包括源数据一起全部删掉。
      
    0	1	2	3	4
    0	1	2	3	2	4
    2	1	6	3	8	9
    4	7	3	1	5	4
      
      
    

六、 缺失数据处理

NaN值和None值都可以被当做空值处理

1. 缺失值得快速补充法

frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])

frame_123
Out[8]: 
     0    1     2    3  4
0  1.0  NaN   NaN  2.0  3
1  1.0  2.0  3.00  NaN  8
2  6.0  2.3  8.00  NaN  3
3  2.0  3.0  2.00  3.0
2
4  3.2  8.9  3.00  4.5  3
5  2.0  3.0  0.45  NaN  8

pd.isnull(frame_123)
Out[9]: 
       0      1      2      3      4
0  False   True   True  False  False
1  False  False  False   True  False
2  False  False  False   True  False
3  False  False  False  False  False
4  False  False  False  False  False
5  False  False  False   True  False

boolmatrix_1=pd.isnull(frame_123)
frame_123[boolmatrix_1]=0
frame_123
Out[13]: 
     0    1     2    3  4
0  1.0  0.0  0.00  2.0  3
1  1.0  2.0  3.00  0.0  8
2  6.0  2.3  8.00  0.0  3
3  2.0  3.0  2.00  3.0  2
4  3.2  8.9  3.00  4.5  3
5  2.0  3.0  0.45  0.0  8


2. Dropna过滤NaN数据

  • series.drop()

    series_23=pd.Series([1,4,3,np.nan,4.5,None,3.4,4.5,6,np.nan,4,5,3])
      
    series_23
    Out[20]: 
    0     1.0
    1     4.0
    2     3.0
    3     NaN
    4     4.5
    5     NaN
    6     3.4
    7     4.5
    8     6.0
    9     NaN
    10    4.0
    11    5.0
    12    3.0
    dtype: float64
      
    series_23.dropna()
    Out[21]: 
    0     1.0
    1     4.0
    2     3.0
    4     4.5
    6     3.4
    7     4.5
    8     6.0
    10    4.0
    11    5.0
    12    3.0
    dtype: float64
      
      
    
  • series.notnull()

    series_23[series_23.notnull()]
    Out[22]: 
    0     1.0
    1     4.0
    2     3.0
    4     4.5
    6     3.4
    7     4.5
    8     6.0
    10    4.0
    11    5.0
    12    3.0
    dtype: float64
      
      
    
  • df.dropna()

    Dropna 用于DataFrame和用于Series稍有不同。用于DataFrame,含有NaN值的行会被删去。

    frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])
      
    frame_123
    Out[28]: 
         0    1     2    3  4
    0  1.0  NaN   NaN  2.0  3
    1  1.0  2.0  3.00  NaN  8
    2  6.0  2.3  8.00  NaN  3
    3  2.0  3.0  2.00  3.0  2
    4  3.2  8.9  3.00  4.5  3
    5  2.0  3.0  0.45  NaN  8
      
    frame_123.dropna()
    Out[27]: 
         0    1    2    3  4
    3  2.0  3.0  2.0  3.0  2
    4  3.2  8.9  3.0  4.5  3
      
    # how=’all’只会消除全为NaN的行:
    matrix_2=frame_123.dropna(how='all')
      
    matrix_2
    Out[32]: 
         0    1     2    3  4
    0  1.0  NaN   NaN  2.0  3
    1  1.0  2.0  3.00  NaN  8
    2  6.0  2.3  8.00  NaN  3
    3  2.0  3.0  2.00  3.0  2
    4  3.2  8.9  3.00  4.5  3
    5  2.0  3.0  0.45  NaN  8
      
      
    

3. 缺失值的补充

  • df.fillna()

    frame_1
    Out[67]: 
              0         1         2         3
    0 -0.668146       NaN       NaN  1.444138
    1 -1.167959       NaN       NaN -1.100771
    2 -1.657068       NaN       NaN  2.525831
    3 -1.869547       NaN  0.275511 -0.459739
    4 -0.287525       NaN  2.145633  0.703735
    5  0.499207 -0.385792 -1.192131 -1.679805
    6 -0.529885  2.053872  0.970785 -0.733382
      
    frame_1.fillna({1:5,2:4})
    Out[7]: 
              0         1         2         3
    0  1.651360  5.000000  4.000000 -0.600997
    1 -0.020649  5.000000  4.000000 -0.529843
    2 -0.850476  5.000000  4.000000 -0.893813
    3  0.812226  5.000000  0.614715  0.112509
    4  0.074320  5.000000  1.145727  0.168718
    5 -0.516371 -1.022050  0.774645  0.705847
    6  0.617606  0.881843 -0.619870 -1.527961
      
    frame_1.fillna({1:pd.Series([2,3,7,9,0],index=[0,1,2,3,4]),2:pd.Series([1,9,8],index=[0,1,2])})
    Out[108]: 
              0         1         2         3
    0 -0.748195  2.000000  1.000000 -0.539246
    1 -2.360077  3.000000  9.000000 -0.061078
    2 -1.743350  7.000000  8.000000 -0.233060
    3 -2.100371  9.000000  0.187509  0.893321
    4 -0.477253  0.000000  1.876733  0.208389
    5  0.770411 -2.262797  0.321646 -2.490215
    6  1.265209 -0.453140  0.045817  0.951077
      
      
    

七、层次化索引

  1. 创建层次化索引
series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,8,7,6,5,4,3,2,1,0,12,11]])

series_1
Out[8]: 
r1  9     1.536272
    8     0.378965
    7    -0.292986
t1  6    -0.254990
    5     0.765191
s1  4     2.204928
    3     0.662662
    2    -0.595029
    1    -1.905753
p1  0    -1.029524
q1  12   -1.038748
    11   -1.192589
dtype: float64

series_1.index
Out[9]: 
MultiIndex(levels=[['p1', 'q1', 'r1', 's1', 't1'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12]],
           labels=[[2, 2, 2, 4, 4, 3, 3, 3, 3, 0, 1, 1], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 11, 10]])


Gamedata=pd.DataFrame(np.array([[31,27,24,60],[26,28,13,29],[27,17,12,27],[29,9,5,18],[31,12,4,70],[45,11,12,12]]),index=[['Morning','Morning','Morning','Afternoon','Afternoon','Afternoon'],[1,2,3,1,2,3]],columns=[['Junior','Junior','Youth','Youth'],['Zhang','Wang','Li','Zhao']])

Gamedata
Out[35]: 
            Junior      Youth     
             Zhang Wang    Li Zhao
Morning   1     31   27    24   60
          2     26   28    13   29
          3     27   17    12   27
Afternoon 1     29    9     5   18
          2     31   12     4   70
          3     45   11    12   12


2. 检索外层索引

series_1['s1'][内层标签]
或者 series_1['s1',内层标签]
Out[6]: 
4   -0.012306
3    0.800679
2   -0.862986
1    0.048458
dtype: float64
#对于Series,中括号的第一个位置是代表外层标签,第二位置代表内存标签


3. 切片

外层标签必须是经过排序的,每个外层标签的第一个字母不能不一致,要大写,全大写,要小写全小写。

Series_123=pd.Series(np.random.randint(10),index=[['apple','apple','apple','apricot','apricot','apricot','banana','banana','blackberry','cherry'],[3,2,5,6,0,4,9,11,21,17]])

Series_123['apple']
Out[4]: 
3    9
2    9
5    9
dtype: int64

Series_123['apple':'banana']
Out[64]: 
apple    3     5
         2     5
         5     5
apricot  6     5
         0     5
         4     5
banana   9     5
         11    5
dtype: int64

Series_123['apple':'apricot']
Out[65]: 
apple    3    5
         2    5
         5    5
apricot  6    5
         0    5
         4    5
dtype: int64

Series_123['apple':'blackberry']
Out[67]: 
apple       3     5
            2     5
            5     5
apricot     6     5
            0     5
            4     5
banana      9     5
            11    5
blackberry  21    5
dtype: int64


3. 数据框重排

  • series.unstack()

    unstack()方法是针对索引或者标签的,即将列索引转成最内层的行索引;

    Series_67=pd.Series(np.random.randint(10),index=[['apple','apple','apple','apricot','apricot','apricot','banana','banana','blackberry','cherry'],[3,2,5,6,5,4,9,5,21,17]])
      
    Series_67.unstack(1)
    # 默认 axis=1 内层索引转化为行标签
    Out[20]: 
                 2    3    4    5    6    9    17   21
    apple       4.0  4.0  NaN  4.0  NaN  NaN  NaN  NaN
    apricot     NaN  NaN  4.0  4.0  4.0  NaN  NaN  NaN
    banana      NaN  NaN  NaN  4.0  NaN  4.0  NaN  NaN
    blackberry  NaN  NaN  NaN  NaN  NaN  NaN  NaN  4.0
    cherry      NaN  NaN  NaN  NaN  NaN  NaN  4.0  NaN
      
    #Series的内层索引变化为列标签,外层索引转化为行标签,并且重复索引删除,索引保持唯一性。
      
      
    
  • df.stack()

    stack()是unstack()的逆操作

    带有层次化索引的Series可以立马转化为数据框,反之,数据框也可以转化为带有层次化索引的Series

  • 层次化索引数据框

    Gamedata=pd.DataFrame(np.array([[31,27,24,60],[26,28,13,29],[27,17,12,27],[29,9,5,18],[31,12,4,70],[45,11,12,12]]),index=[['Morning','Morning','Morning','Afternoon','Afternoon','Afternoon'],[1,2,3,1,2,3]],columns=[['Junior','Junior','Youth','Youth'],['Zhang','Wang','Li','Zhao']])
      
    Gamedata
    Out[35]: 
                Junior      Youth     
                 Zhang Wang    Li Zhao
    Morning   1     31   27    24   60
              2     26   28    13   29
              3     27   17    12   27
    Afternoon 1     29    9     5   18
              2     31   12     4   70
              3     45   11    12   12
      
      
    
  • df.swaplevel()(调整某条轴上各级别的顺序) 下面两个不好用

    Gamedata
    Out[50]: 
    age                  Junior      Youth     
    name                  Zhang Wang    Li Zhao
    time        sequence                       
    A_Morning   1            31   27    24   60
                2            26   28    13   29
                3            27   17    12   27
    B_Afternoon 1            29    9     5   18
                2            31   12     4   70
                3            45   11    12   12
      
      
    Gamedata.swaplevel('sequence','time')
    Out[52]: 
    age                  Junior      Youth     
    name                  Zhang Wang    Li Zhao
    sequence time                              
    1        A_Morning       31   27    24   60
    2        A_Morning       26   28    13   29
    3        A_Morning       27   17    12   27
    1        B_Afternoon     29    9     5   18
    2        B_Afternoon     31   12     4   70
    3        B_Afternoon     45   11    12   12
      
      
    Gamedata.swaplevel('age','name',axis=1)
    Out[60]: 
    name                  Zhang   Wang    Li  Zhao
    age                  Junior Junior Youth Youth
    time        sequence                          
    A_Morning   1            31     27    24    60
                2            26     28    13    29
                3            27     17    12    27
    B_Afternoon 1            29      9     5    18
                2            31     12     4    70
                3            45     11    12    12
      
      
    
  • df.sortlevel()(根据指定级别上的值对数据进行排序)

4. 根据级别计算

Gamedata
Out[62]: 
age                  Junior      Youth     
name                  Zhang Wang    Li Zhao
time        sequence                       
A_Morning   1            31   27    24   60
            2            26   28    13   29
            3            27   17    12   27
B_Afternoon 1            29    9     5   18
            2            31   12     4   70
            3            45   11    12   12

Gamedata.sum(level='sequence')
Out[64]: 
age      Junior      Youth     
name      Zhang Wang    Li Zhao
sequence                       
1            60   36    29   78
2            57   40    17   99
3            72   28    24   39
# 每个级别包含两个元素,(因为此级别标签分别重复两次。)


Gamedata.sum(level='name',axis=1)
Out[68]: 
name                  Li  Wang  Zhang  Zhao
time        sequence                       
A_Morning   1         24    27     31    60
            2         13    28     26    29
            3         12    17     27    27
B_Afternoon 1          5     9     29    18
            2          4    12     31    70
            3         12    11     45    12

# 每个级别只包含一个元素,因此无法相加,只能排序。


Gamedata.sum(level='age',axis=1)
Out[69]: 
age                   Junior  Youth
time        sequence               
A_Morning   1             58     84
            2             54     42
            3             44     39
B_Afternoon 1             38     23
            2             43     74
            3             56     24
            
#每个级别包含两个元素,分别两两相加。


Gamedata.sum(level='time')
Out[71]: 
age         Junior      Youth     
name         Zhang Wang    Li Zhao
time                              
A_Morning       84   72    49  116
B_Afternoon    105   32    21  100

每个级别包含三个元素,分别相加即可


5. 数据框列转行索引

  • df.set_index()

    frame_1123=pd.DataFrame({'a':range(4),'b':range(4,0,-1),'c':['one','one','two','two'],'d':[0,1,2,3]})
      
    frame_1123
    Out[73]: 
       a  b    c  d
    0  0  4  one  0
    1  1  3  one  1
    2  2  2  two  2
    3  3  1  two  3
      
    frame_1224=frame_1123.set_index(['c','d'])
      
    frame_1224
    Out[76]: 
           a  b
    c   d      
    one 0  0  4
        1  1  3
    two 2  2  2
        3  3  1
          
    frame_1123.set_index(['c','d'],drop=False)
    Out[79]: 
           a  b    c  d
    c   d              
    one 0  0  4  one  0
        1  1  3  one  1
    two 2  2  2  two  2
    	3  3  1  two  3
      
      
    
  • df.reset_index()

    # 把双重索引再转化到数据框的数据区域。
    frame_1123.reset_index()
    Out[82]: 
       index  a  b    c  d
    0      0  0  4  one  0
    1      1  1  3  one  1
    2      2  2  2  two  2
    3      3  3  1  two  3
      
      
    

八、pandas拼接

  • concat:可以沿一条轴将多个对象连接到一起
  • merge:可以根据一个或多个键将不同的DataFrame中的行连接起来。
  • join:inner是交集,outer是并集。

pd.concat

制定按某个轴进行连接(可横向可纵向),也可以指定连接方法。

def concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
           keys=None, levels=None, names=None, verify_integrity=False,
           sort=None, copy=True):


属性 描述
objs 合并的对象集合。可以是Series、DataFrame
axis 合并方法。默认0,表示纵向,1横向
join 默认outer并集,inner交集。只有这两种
join_axes 按哪些对象的索引保存
ignore_index 默认Fasle忽略。是否忽略原index
keys 为原始DataFrame添加一个键,默认无
s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])
s3 = pd.concat([s1, s2])
s4 = pd.concat([s1, s2], ignore_index=True)
print(s3)
print(s4)

0    a
1    b
dtype: object
0    c
1    d
dtype: object
0    a
1    b
0    c
1    d
dtype: object
0    a
1    b
2    c
3    d
dtype: object


df1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['A', 0])
df2 = pd.DataFrame([['a', 1], ['b', 2]], columns=['B', 0])
df3 = pd.concat([df1, df2], join='inner')
print(df3)

   0
0  1
1  2
0  1
1  2


df1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['A', 0])
df2 = pd.DataFrame([['a', 1], ['b', 2]], columns=['B', 0])
df3 = pd.concat([df1, df2], axis=1, join_axes=[df1.index])
print(df3)

   A  0  B  0
0  a  1  a  1
1  b  2  b  2


pd.join

join方法将两个DataFrame中不同的列索引合并成为一个DataFrame 参数的意义与merge基本相同,只是join方法默认左外连接how=left

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A1'],
                    'B': ['B0', 'B1', 'B2']},
                   index=['K0', 'K1', 'K2'])
df2 = pd.DataFrame({'C': ['C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2']},
                   index=['K0', 'K1', 'K3'])
df3 = df1.join(df2)
df4 = df1.join(df2, how='outer')
df5 = df1.join(df2, how='inner')
print(df3)
print(df4)
print(df5)

     A   B    C    D
K0  A0  B0   C1   D0
K1  A1  B1   C2   D1
K2  A1  B2  NaN  NaN
      A    B    C    D
K0   A0   B0   C1   D0
K1   A1   B1   C2   D1
K2   A1   B2  NaN  NaN
K3  NaN  NaN   C3   D2
     A   B   C   D
K0  A0  B0  C1  D0
K1  A1  B1  C2  D1


pd.merge

merge 函数通过一个或多个键将数据集的行连接起来。 场景:针对同一个主键存在的两张包含不同特征的表,通过主键的链接,将两张表进行合并。合并之后,两张表的行数不增加,列数是两张表的列数之和。

# pandas提供了一个类似于关系数据库的连接(join)操作的方法merage,可以根据一个或多个键将不同DataFrame中的行连接起来
pd.merge(df1,df2,on = '') 

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)
left与right:两个不同的DataFrame
how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner
on : 指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
right_on:右则DataFrame中用作 连接键的列名
left_index:使用左则DataFrame中的行索引做为连接键
right_index:使用右则DataFrame中的行索引做为连接键
sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能
suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')
copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)


特性:
1.默认以重叠的列名当做连接键。
2.默认做inner连接(取key的交集),连接方式还有(left,right,outer),制定连接方式加参数:how=''
3.多键连接时将连接键组成列表传入,例:pd.merge(df1,df2,on=['key1','key2']
4.如果两个对象的列名不同,可以分别指定,例:pd.merge(df1,df2,left_on='lkey',right_on='rkey')


# 默认:以重叠的列名当作连接键
df1 = pd.DataFrame({'key': ['one', 'two', 'two'],
                    'data1': np.arange(3)})
df2 = pd.DataFrame({'key': ['one', 'three', 'three'],
                    'data2': np.arange(3)})
df3 = pd.merge(df1, df2)
print(df1)
print(df2)
print(df3)

   key  data1
0  one      0
1  two      1
2  two      2
     key  data2
0    one      0
1  three      1
2  three      2
   key  data1  data2
0  one      0      0


# 默认:做inner连接,取key的交集
连接方式还有left right outer
df1 = pd.DataFrame({'key': ['one', 'two', 'two'],
                    'data1': np.arange(3)})
df2 = pd.DataFrame({'key': ['one', 'three', 'three'],
                    'data2': np.arange(3)})
df3 = pd.merge(df1, df2)
df4 = pd.merge(df1, df2, how='left')
print(df3)
print(df4)

   key  data1  data2
0  one      0      0
   key  data1  data2
0  one      0    0.0
1  two      1    NaN
2  two      2    NaN


# 多键连接时将连接键做成列表传入。
on默认是两者同时存在的列
df1 = pd.DataFrame({'key': ['one', 'two', 'two'],
                    'value': ['a', 'b', 'c'],
                    'data1': np.arange(3)})
df2 = pd.DataFrame({'key': ['one', 'two', 'three'],
                    'value': ['a', 'c', 'c'],
                    'data2': np.arange(3)})
df5 = pd.merge(df1, df2)
df6 = pd.merge(df1, df2, on=['key', 'value'], how='outer')
print(df5)
print(df6)

   key value  data1  data2
0  one     a      0      0
1  two     c      2      1
     key value  data1  data2
0    one     a    0.0    0.0
1    two     b    1.0    NaN
2    two     c    2.0    1.0
3  three     c    NaN    2.0


# 两个对象的列名不同,需要分别制定。
df7 = pd.merge(df1, df2, left_on=['key1','data1'], right_on=['key2','data2'], how='outer')
print(df7)

  key1 value_x  data1   key2 value_y  data2
0  one       a    0.0    one       a    0.0
1  two       b    1.0    two       c    1.0
2  two       c    2.0    NaN     NaN    NaN
3  NaN     NaN    NaN  three       c    2.0


九、Panel面板

面板是具有异构数据的三维数据结构。在图形表示中很难表示面板。但是一个面板可以说明为DataFrame的容器。

面板创建

创建的三维数组,分别对应相应的item,主轴和次轴。

pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)

items		相当于上图中的分类标签。在item确定之后,就可以将其看作dataframe 
Major_axis	即为dataframe中的index。 
Minor_axis	为dataframe中的columns。


  • 通过3维数组创建面板

    import pandas as pd
    import numpy as np
    df = pd.Panel(np.random.rand(2,3,4))
    print (df)
      
    <class 'pandas.core.panel.Panel'>
    Dimensions: 2 (items) x 3 (major_axis) x 4 (minor_axis)
    Items axis: 0 to 1
    Major_axis axis: 0 to 2
    Minor_axis axis: 0 to 3
      
      
    
     pan = pd.Panel(np.random.randn(2,5,4),items=['Item1','Item2'],major_axis=pd.date_range('2000-01-01','2000-01-05'),minor_axis=['A','B','C','D'])
     Out[107]: 
    <class 'pandas.core.panel.Panel'>
    Dimensions: 2 (items) x 5 (major_axis) x 4 (minor_axis)
    Items axis: Item1 to Item2
    Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
    Minor_axis axis: A to D
      
      
    
  • 通过字典dataframe创建面板

    import pandas as pd
      
    d = {"one": pd.DataFrame([1, 2, 3],index=["a","b","c"], columns=["hh"])}
      
    df = pd.Panel(d)
    print (df)
      
    <class 'pandas.core.panel.Panel'>
    Dimensions: 1 (items) x 3 (major_axis) x 1 (minor_axis)
    Items axis: one to one
    Major_axis axis: a to c
    Minor_axis axis: hh to hh
      
      
    
    data = {'Item1' : pd.DataFrame(np.random.randn(4, 3),index=pd.date_range('2017-09-05','2017-09-08'),columns=['X','D','F']),'Item2' : pd.DataFrame(np.random.randn(4, 2),index=pd.date_range('2017-09-05','2017-09-08'),columns=['X','D'])}
      
    panel_1=pd.Panel(data)
      
    panel_1
    Out[115]: 
    <class 'pandas.core.panel.Panel'>
    Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
    Items axis: Item1 to Item2
    Major_axis axis: 2017-09-05 00:00:00 to 2017-09-08 00:00:00
    Minor_axis axis: D to X
      
      
    
  • 通过层次化索引数据框创建

    import pandas as pd
    import numpy as np
      
    Gamedata=pd.DataFrame(np.array([[31,27,24,60],[26,28,13,29],[27,17,12,27],[29,9,5,18],[31,12,4,70],[45,11,12,12]]),index=[['Morning','Morning','Morning','Afternoon','Afternoon','Afternoon'],[1,2,3,1,2,3]],columns=[['Junior','Junior','Youth','Youth'],['Zhang','Wang','Li','Zhao']])
      
    pan = Gamedata.to_panel()
      
    print(pan['Junior','Wang'])
      
                1   2   3
    Afternoon   9  12  11
    Morning    27  28  17
    [Finished in 1.2s]
      
      
    

面板操作

import pandas as pd
import numpy as np

df = pd.Panel(np.random.rand(2,3,4),
              items=["aa","bb"],major_axis=["a","b","c"],minor_axis=["q","w","e","f"])
print (df)
print("选择项目",df["aa"])
print("选择主轴",df.major_xs("b"))
print("选择次轴",df.minor_xs("q"))
print("选择某元素",df["aa","b","q"])


<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 3 (major_axis) x 4 (minor_axis)
Items axis: aa to bb
Major_axis axis: a to c
Minor_axis axis: q to f
选择项目           q         w         e         f
a  0.488587  0.855737  0.032916  0.106395
b  0.950385  0.251045  0.051626  0.427011
c  0.271140  0.774883  0.066487  0.129807
选择主轴          aa        bb
q  0.950385  0.235801
w  0.251045  0.353422
e  0.051626  0.595372
f  0.427011  0.314126
选择次轴          aa        bb
a  0.488587  0.695660
b  0.950385  0.235801
c  0.271140  0.757256
选择某元素 0.9503852814428109


  • panel.major_axis 获取主轴标签

十、数据加载与存储

数据加载,存储,清理,转换,合并与重塑

csv 文件

  • pd.read_csv()

    frame_1=pd.read_csv('Desktop\example_1.csv')
    frame_1
    Out[10]: 
       Liu  Zhang  Wang  Li           Class
    0   23     34    78  32       'primary'
    1   77     32    89  66  'intermediate'
    2   99     34    78  66        'senior'
    3   66     34     6  33  'intermediate'
      
    # 自动加列名
    frame_3=pd.read_csv('Desktop\example_2.csv',header=None)
      
    frame_3
    Out[21]: 
        0   1   2   3               4
    0  23  34  78  32       'primary'
    1  77  32  89  66  'intermediate'
    2  99  34  78  66        'senior'
    3  66  34   6  33  'intermediate'
      
    # 添加列标签
    frame_3=pd.read_csv('Desktop\example_2.csv',names=['a','b','c','d','class'])
      
    frame_3
    Out[23]: 
        a   b   c   d           class
    0  23  34  78  32       'primary'
    1  77  32  89  66  'intermediate'
    2  99  34  78  66        'senior'
    3  66  34   6  33  'intermediate'
      
    # 列数据转化成行索引列
    frame_3=pd.read_csv('Desktop\example_2.csv',names=['a','b','c','d','class'],index_col='class')
      
    frame_3
    Out[28]: 
                     a   b   c   d
    class                         
    'primary'       23  34  78  32
    'intermediate'  77  32  89  66
    'senior'        99  34  78  66
    'intermediate'  66  34   6  33
      
    # 读取为多重索引的数据框
    pd.read_csv('Desktop\example_5.csv',index_col=['group','games'])
    Out[45]: 
                 a  b  c  a.1  b.1  c.1  a.2  b.2  c.2
    group games                                       
    one   Att    4  3  4    2    4    3    4    2    1
          Cgt    4  3  4    2    4    3    4    2    1
          Aer    4  3  4    2    4    3    4    2    1
    two   Att    4  3  4    2    4    3    4    2    1
          Cgt    4  3  4    2    4    3    4    2    1
          Aer    4  3  4    2    4    3    4    2    1
      
    # 对于那些用数量不等空格或者字符串隔开的数据,我们可以通过正则操作符一步处理到位,把数据处理整齐:
    pd.read_csv('Desktop\exampel_6.csv',sep='\s+')
    Out[63]: 
             A      B      C'
    aaa -3.450  2.360   8.90'
    bbb  0.334  0.457   -4.5'
    ccc  0.760 -7.340  -8.99'
    ddd  0.370 -7.800  -4.45'
      
    # 利用skiprows语句可以跳过任意无意义行信息。
    pd.read_csv('Desktop\example_9.csv',skiprows=[0,1,3,4,7])
    Out[69]: 
             a   b   c   d      name
    group1  12   2   2   3    robert
    group2  10  19  18  17      linz
    group3  29  28  27  27      hans
    group4  34  35  35  36  manfried
      
      
      
    
  • pd.read_table()

    frame_1=pd.read_table('Desktop\example_1.csv')
      
    frame_1
    Out[15]: 
          Liu,Zhang,Wang,Li,Class
    0       23,34,78,32,'primary'
    1  77,32,89,66,'intermediate'
    2        99,34,78,66,'senior'
    3   66,34,6,33,'intermediate'
      
    # 加上分割符号‘,’
    frame_1=pd.read_table('Desktop\example_1.csv',sep=',')
      
    frame_1
    Out[13]: 
       Liu  Zhang  Wang  Li           Class
    0   23     34    78  32       'primary'
    1   77     32    89  66  'intermediate'
    2   99     34    78  66        'senior'
    3   66     34     6  33  'intermediate'
      
    # 通过nrows属性函数可以选择所需要的行数
    pd.read_table('Desktop\example_14.csv',sep=',',nrows=8)
    Out[21]: 
       one  two  three  four
    0    0    1      2     3
    1    4    5      6     7
    2    8    9     10    11
    3   12   13     14    15
    4   16   17     18    19
    5   20   21     22    23
    6   12   13     14    15
    7   16   17     18    19
      
      
    
    # 通过na_values python可以用字符串标识NAN值
    pd.read_table('Desktop\example_12.csv',na_values=['me'],sep=',')
    Out[14]: 
        A     B   C     D
    0   1   2.0   3   4.0
    1   5   NaN   7   8.0
    2   8  10.0  11   NaN
    3  12  13.0  14  16.0
      
      
    
    # 可以用字符串字典的形式标识多空值数据框
    !type Desktop\example_13.csv
    A,B,C,D
    1,2,3,4
    too,to,56,33
    45,dee,78,69
    12,21,34,43
      
    pd.read_table('Desktop\example_13.csv',na_values={'A':'too','B':['to','dee']},sep=',')
    Out[18]: 
          A     B   C   D
    0   1.0   2.0   3   4
    1   NaN   NaN  56  33
    2  45.0   NaN  78  69
    3  12.0  21.0  34  43
      
      
    

Excel 文件

  • pd.read_excel()

    pd.read_excel(r'Desktop\1.xls' ,sheetname=[0,1],header = None,index_col=None,names=None)
    # sheetname=表格时,返回多个指定的在一个workbook里面的表格,sheetname=none,将返回一个workbook里的所有表格。sheetname=int时,int指的是表格索引号,sheetname=’sheet1‘返回指定表格。
      
    pd.read_excel(r'Desktop\1.xls' ,sheetname=None)
      
    #sheetname=整数时,整数表示表格编号,编号从0开始。
    pd.read_excel(r'Desktop\1.xls' ,sheetname=2)
      
    #用字符串‘Sheet3’来调用表格三数据
    pd.read_excel(r'Desktop\1.xls' ,sheetname='Sheet3')
      
    # header : int, list of ints, default 0 指定列索引行,默认0,即取第一行,即数据第一行被自动读取为列索引,这一点我们并不希望,因为会丢失掉第一行数据,因此通常设定 header = None,这种情况下,计算机自动为整个数据添加新的列索引。
      
    pd.read_excel(r'Desktop\1.xls' ,sheetname='Sheet3',header=None)
    Out[10]: 
          0   1   2   3     4
    0   234  22  44  78   990
    1   235  23  45  79   991
    2   236  24  46  80   992
    3   237  25  47  81   993
    4   238  26  48  82   994
    5   239  27  49  83   995
      
    # skiprows : list-like,跳过指定行数的数据 
    pd.read_excel(r'Desktop\1.xls' ,sheetname='Sheet3',header=None,skiprows=[1,5,19,10])
      
    # skip_footer : int,default 0, 省略从尾部数的整数行数据 
      
    pd.read_excel(r'Desktop\1.xls' ,sheetname='Sheet3',header=None,skip_footer=8)	# 从下向上数8行,然后跳过这8行
      
    # index_col : int, list of ints, default None指定某列为索引列
    pd.read_excel(r'Desktop\1.xls' ,sheetname='Sheet3',header=None,index_col=4)
    Out[15]: 
            0   1   2   3
    4                    
    990   234  22  44  78
    991   235  23  45  79
    992   236  24  46  80
    993   237  25  47  81
    994   238  26  48  82
      
    #names : array-like, default None, 给所有列索引重新命名。
    pd.read_excel(r'Desktop\1.xls' ,sheetname='Sheet3',names=['col_1','col_2','col_3','col_4','col_5'])
    Out[17]: 
        col_1  col_2  col_3  col_4  col_5
    0     235     23     45     79    991
    1     236     24     46     80    992
    2     237     25     47     81    993
    3     238     26     48     82    994
      
      
      
    

娃子的cnn

test = pd.read_csv('./datalab/38156/test_xg.csv')

cnn

reader = csv.reader(open('./datalab/38156/train.csv', 'r'))
reader = csv.reader(open('./datalab/38156/trainlabel.csv', 'r'))
reader = csv.reader(open('./datalab/38156/testlabel.csv', 'r'))
z.to_csv('./datalab/38156/train_xg.csv',index=False)
z.to_csv('./datalab/38156/test_xg.csv',index=False)
train = pd.read_csv('./datalab/38156/train_xg.csv')
test = pd.read_csv('./datalab/38156/test_xg.csv')
import


import numpy as np
import csv
from sklearn import preprocessing
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import timeit
import matplotlib.pyplot as plt
# important step

Cnn跑出来的结果:

##################################################################
0 误差= 7916.1
100 误差= 2138.83
200 误差= 837.204
300 误差= 535.708
400 误差= 610.987
model has been saved
Computation total time: 189.463818s
==================================================================================


MSE_train: 290.024

R-Square_train: 0.963
==================================================================================

img

Pretraining total time: 0.028569s
==================================================================================


MSE_33: 1059.476

R-Square_33: 0.335
==================================================================================

Pretraining total time: 0.006676s
==================================================================================


MSE_27: 257.609

R-Square_27: 0.883
==================================================================================

Pretraining total time: 0.008323s
==================================================================================


MSE_9: 572.492

R-Square_9: 0.598
==================================================================================

Pretraining total time: 0.007592s
==================================================================================


MSE_50: 336.224

R-Square_50: 0.871
==================================================================================

Pretraining total time: 0.027014s
==================================================================================


MSE: 548.245

R-Square: 0.717
==================================================================================

xgboost

reader = csv.reader(open('./datalab/38156/train.csv', 'r'))
reader = csv.reader(open('./datalab/38156/trainlabel.csv', 'r'))
reader = csv.reader(open('./datalab/38156/33label.csv', 'r'))
reader = csv.reader(open('./datalab/38156/9label.csv', 'r'))
reader = csv.reader(open('./datalab/38156/27label.csv', 'r'))
reader = csv.reader(open('./datalab/38156/50label.csv', 'r'))
reader = csv.reader(open('./datalab/38156/testlabel.csv', 'r'))
saver.save(sess, "model_saved/model.ckpt")
211
csvFile2 = open('./datalab/38156/pre_train.csv','w', newline='') # 设置newline,否则两行之间会空一行
csvFile2 = open('./datalab/38156/pre_train.csv','w', newline='') # 设置newline,否则两行之间会空一行
csvFile2 = open('./datalab/38156/pre_test.csv','w', newline='') # 设置newline,否则两行之间会空一行

#cnn with xgboost
import numpy as np
np.random.seed(1337)  # for reproducibility
from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten, Input, Dropout
from keras.optimizers import Adam
from sklearn import preprocessing
import csv
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import timeit

#with xgboost
import xgboost
import pandas as pd
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt

xgboost跑出的结果

[[ 101.76]]
[[ 101.76]]
Training ------------
Epoch 1/150
5300/5300 [==============================] - 3s 507us/step - loss: 7298.1312
Epoch 2/150
5300/5300 [==============================] - 2s 436us/step - loss: 6626.7701
...
Epoch 149/150
5300/5300 [==============================] - 2s 435us/step - loss: 1274.4401
Epoch 150/150
5300/5300 [==============================] - 2s 444us/step - loss: 1161.1033

Testing ------------
518/518 [==============================] - 0s 248us/step

test loss:  260.271826545
[0]	train-rmse:84.2783
[1]	train-rmse:73.6748
[2]	train-rmse:64.549
[3]	train-rmse:56.647
[4]	train-rmse:49.8402
[5]	train-rmse:43.9786
...
[298]	train-rmse:0.568647
[299]	train-rmse:0.564586
Computation total time: 375.055456s
Pretraining total time: 0.010018s
[  4.50477638e+01   5.30155029e+01   4.56669884e+01   2.87846756e+01
   2.51728363e+01   2.04993858e+01   3.57979546e+01   3.65655746e+01
   ...
  -2.15689182e-01   4.67609853e-01   2.97492981e-01   5.78347325e-01
   5.48953831e-01   4.92109001e-01]
==================================================================================


MSE_test: 380.939

R-Square_test: 0.803
==================================================================================

数据分析pandas

csv文件-文件完整取值

序言:困惑:
1.很容易的读取了CSV文件内容;
2.通常采用","作为分隔符,但一直没有发现一个严重的错误;
3.如果在CSV文件里头的某一个数据也含有","采集,就会出现数据缺漏的情况,好比如这一行数据:"xxx,深圳湾一号,2018,“1,000,000”",那么我们可能在这个双引号“1,000,000”取错了值。
🌹

(PS:基于Mac硬件环境、Jupyter Notebook软件工具环境编写)
# 代码
import csv

path = "/Users/Chaorenyuan/Desktop/商铺数据.csv"
test = ",。;" # 将CSV文件定制成自己想要的分隔符
csvData = []

with open(path, newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        csvData.append(test.join(row))
print(csvData)

CSV (Comma‐Separated Value, 逗号分隔值) CSV是一种常见的文件格式,用来存储批量数据

注意:python3.01此版本的csv模块不支持Unicode输入。此外,目前有一些关于ASCII NUL字符的问题。因此,所有输入应为UTF-8或可打印的ASCII以确保安全;

城市,环比,同比,定基 北京,101.5,120.7,121.4 上海,101.2,127.3,127.8 广州,101.3,119.4,120.0 深圳,102.0,140.9,145.5 沈阳,100.1,101.4,101.6

np.savetxt(frame, array, fmt='%.18e', delimiter=None) • frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件 • array : 存入文件的数组 • fmt : 写入文件的格式,例如:%d %.2f %.18e • delimiter : 分割字符串,默认是任何空格

Pandas速查手册

在这个速查手册中,我们使用如下缩写:

df:任意的Pandas DataFrame对象 s:任意的Pandas Series对象

同时我们需要做如下的引入:

import pandas as pd import numpy as np

导入数据

  • pd.read_csv(filename):从CSV文件导入数据
  • pd.read_table(filename):从限定分隔符的文本文件导入数据
  • pd.read_excel(filename):从Excel文件导入数据
  • pd.read_sql(query, connection_object):从SQL表/库导入数据
  • pd.read_json(json_string):从JSON格式的字符串导入数据
  • pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
  • pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
  • pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

导出数据

  • df.to_csv(filename):导出数据到CSV文件
  • df.to_excel(filename):导出数据到Excel文件
  • df.to_sql(table_name, connection_object):导出数据到SQL表
  • df.to_json(filename):以Json格式导出数据到文本文件

创建测试对象

  • pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
  • pd.Series(my_list):从可迭代对象my_list创建一个Series对象
  • df.index = pd.date_range(‘1900/1/30’, periods=df.shape[0]):增加一个日期索引

查看、检查数据

  • df.head(n):查看DataFrame对象的前n行
  • df.tail(n):查看DataFrame对象的最后n行
  • df.shape():查看行数和列数
  • df.info():查看索引、数据类型和内存信息
  • df.describe():查看数值型列的汇总统计
  • s.value_counts(dropna=False):查看Series对象的唯一值和计数
  • df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数

数据选取

  • df[col]:根据列名,并以Series的形式返回列
  • df[[col1, col2]]:以DataFrame形式返回多列
  • s.iloc[0]:按位置选取数据
  • s.loc[‘index_one’]:按索引选取数据
  • df.iloc[0,:]:返回第一行
  • df.iloc[0,0]:返回第一列的第一个元素

数据清理

  • df.columns = [‘a’,’b’,’c’]:重命名列名
  • pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
  • pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
  • df.dropna():删除所有包含空值的行
  • df.dropna(axis=1):删除所有包含空值的列
  • df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
  • df.fillna(x):用x替换DataFrame对象中所有的空值
  • s.astype(float):将Series中的数据类型更改为float类型
  • s.replace(1,’one’):用‘one’代替所有等于1的值
  • s.replace([1,3],[‘one’,’three’]):用’one’代替1,用’three’代替3
  • df.rename(columns=lambda x: x + 1):批量更改列名
  • df.rename(columns={‘old_name’: ‘new_ name’}):选择性更改列名
  • df.set_index(‘column_one’):更改索引列
  • df.rename(index=lambda x: x + 1):批量重命名索引

数据处理:Filter、Sort和GroupBy

  • df[df[col] > 0.5]:选择col列的值大于0.5的行
  • df.sort_values(col1):按照列col1排序数据,默认升序排列
  • df.sort_values(col2, ascending=False):按照列col1降序排列数据
  • df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
  • df.groupby(col):返回一个按列col进行分组的Groupby对象
  • df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
  • df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
  • df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
  • data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
  • data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max

  • df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表

数据合并

  • df1.append(df2):将df2中的行添加到df1的尾部
  • df.concat([df1, df2],axis=1):将df2中的列添加到df1的尾部
  • df1.join(df2,on=col1,how=’inner’):对df1的列和df2的列执行SQL形式的join

数据统计

  • df.describe():查看数据值列的汇总统计
  • df.mean():返回所有列的均值
  • df.corr():返回列与列之间的相关系数
  • df.count():返回每一列中的非空值的个数
  • df.max():返回每一列的最大值
  • df.min():返回每一列的最小值
  • df.median():返回每一列的中位数
  • df.std():返回每一列的标准差

窗口函数与分析函数

应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询

窗口函数 FIRST_VALUE: 取分组内排序后,截止到当前行,第一个值 LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值 LEAD(col,n,DEFAULT) : 用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL) LAG(col,n,DEFAULT) : 与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

OVER从句 1、使用标准的聚合函数COUNT、SUM、MIN、MAX、AVG 2、使用PARTITION BY语句,使用一个或者多个原始数据类型的列 3、使用PARTITION BY与ORDER BY语句,使用一个或者多个数据类型的分区或者排序列 4、使用窗口规范,窗口规范支持以下格式: -——————–

`(``ROWS` `| RANGE) ``BETWEEN` `(UNBOUNDED | [num]) PRECEDING ``AND` `([num] PRECEDING | ``CURRENT` `ROW | (UNBOUNDED | [num]) FOLLOWING)``(``ROWS` `| RANGE) ``BETWEEN` `CURRENT` `ROW ``AND` `(``CURRENT` `ROW | (UNBOUNDED | [num]) FOLLOWING)``(``ROWS` `| RANGE) ``BETWEEN` `[num] FOLLOWING ``AND` `(UNBOUNDED | [num]) FOLLOWING`

  

当ORDER BY后面缺少窗口从句条件,窗口规范默认是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

当ORDER BY和窗口从句都缺失, 窗口规范默认是 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

OVER从句支持以下函数, 但是并不支持和窗口一起使用它们。 Ranking函数: Rank, NTile, DenseRank, CumeDist, PercentRank. Lead 和 Lag 函数.

分析函数 ROW_NUMBER()

从1开始,按照顺序,生成分组内记录的序列,比如,按照pv降序排列,生成分组内每天的pv名次,ROW_NUMBER()的应用场景非常多,再比如,获取分组内排序第一的记录;获取一个session中的第一条refer等。

RANK()

生成数据项在分组中的排名,排名相等会在名次中留下空位

DENSE_RANK()

生成数据项在分组中的排名,排名相等会在名次中不会留下空位;

CUME_DIST

小于等于当前值的行数/分组内总行数。比如,统计小于等于当前薪水的人数,所占总人数的比例;

PERCENT_RANK

分组内当前行的RANK值-1/分组内总行数-1

NTILE(n)

用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。

Hive2.1.0及以后支持Distinct 聚合函数

(SUM, COUNT and AVG)中,支持distinct,但是在ORDER BY 或者 窗口限制不支持。

`COUNT``(``DISTINCT` `a) OVER (PARTITION ``BY` `c)`

Hive 2.2.0中在使用ORDER BY和窗口限制时支持distinct

`COUNT``(``DISTINCT` `a) OVER (PARTITION ``BY` `c ``ORDER` `BY` `d ``ROWS` `BETWEEN` `1 PRECEDING ``AND` `1 FOLLOWING)`

Hive2.1.0及以后支持在OVER从句中支持聚合函数

`SELECT` `rank() OVER (``ORDER` `BY` `sum``(b))``FROM` `T``GROUP` `BY` `a;`

他山之石

Pandas速查手册中文版
https://zhuanlan.zhihu.com/p/25630700
python-csv官网
https://docs.python.org/3.0/library/csv.html

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦