• Pandas方法


    1创建数据对象

    Pandas最常用的数据对象是数据框(DataFrame)和Series。数据框与R中的DataFrame格式类似,都是一个二维数组。Series则是一个一维数组,类似于列表。数据框是Pandas中最常用的数据组织方式和对象。有关更多数据文件的读取将在第三章介绍,本节介绍从对象和文件创建数据框的方式,具体如表1所示。

    表1 Pandas创建数据对象

    方法

    用途

    示例

    示例说明

    read_table

    read_csv

    read_excel

    从文件创建数据框

    In: import  pandas as pd   

    In: data1  = pd.read_table('table_data.txt',sep=';')

    读取table_data.txt文件,数据分隔符是;

    DataFrame.from_dict

    DataFrame.from_items

    DataFrame.from_records

    从其他对象例如Series、Numpy数组、字典创建数据框

    In: data_dict  = {'col1': [2, 1, 0], 'col2': ['a', 'b', 'a'], 'col3': [True, True, False]}

    In: data2  = pd.DataFrame.from_dict(data_dict)

    基于字典创建数据框,列名为字典的3个key,每一列的值为key对应的value值

    2 查看数据信息

     

    查看信息常用方法包括对总体概况、描述性统计信息、数据类型和数据样本的查看,具体如表2所示:

    表2 Pandas常用查看数据信息方法汇总

    方法

    用途

    示例

    示例说明

    info

    查看数据框的索引和列的类型、费控设置和内存用量信息。

    In: print(data2.info())

    Out:  <class 'pandas.core.frame.DataFrame'>

    RangeIndex:  3 entries, 0 to 2

    Data  columns (total 3 columns):

    col1    3 non-null int64

    col2    3 non-null object

    col3    3 non-null bool

    dtypes:  bool(1), int64(1), object(1)

    memory  usage: 131.0+ bytes

    None

    返回对象的所有信息

    describe

    显示描述性统计数据,包括集中趋势、分散趋势、形状等。

    In: print(data2.describe())

    Out:    col1

    count   3.0

    mean    1.0

    std     1.0

    min     0.0

    25%     0.5

    50%     1.0

    75%     1.5

    max     2.0

    默认查看数值型列,使用include=  'all'查看所有类型数据

    dtype

    查看数据框每一列的数据类型

    In: print(data2.dtypes)

    Out:  col1     int64

    col2    object

    col3      bool

    dtype:  objectt

    结果是Series类型

    head

    查看前N条结果

    In: print(data2.head(2))

    Out:   col1 col2   col3

    0     2     a  True

    1     1     b  True

    从第一行开始取前2行

    tail

    查看后N条结果

    In: print(data2.tail(2))

    Out:   col1 col2    col3

    1     1     b   True

    2     0     a  False

    从最后一行开始取后2行

    index

    查看索引

    In:  print(data2.index)

    Out: RangeIndex(start=0,  stop=3, step=1)

    结果是一个类列表的对象,可用列表方法操作对象

    columns

    查看列名

    In:  print(data2.columns)

    Out: Index(['col1',  'col2', 'col3'], dtype='object')

    shape

    查看形状,记录有多少行多少列

    In: print(data2.shape)

    Out:  (3,3)

    形状为元组类型

    isnull

    查看每个值是否为空值

    In:  print(data2.isnull())

    Out:    col1    col2   col3

    0  False   False  False

    1  False   False  False

    2  False   False  False

    数据中没有空值,因此都是False

    unique

    查看特定列的唯一值

    In:  print(data2['col2'].unique())

    Out:  ['a' 'b']

    查看col2列的唯一值

    注意 在上述查看方法中,除了info方法外,其他方法返回的对象都可以直接赋值给变量,然后基于变量对象做二次处理。例如可以从dtype的返回值中仅获取类型为bool的列。

    3 数据切片和切块

     

    数据切片和切块是使用不同的列或索引切分数据,实现从数据中获取特定子集的方式。常见的数据切片和切换的方式如表3所示:

    表3 Pandas常用数据切分方法

    方法

    用途

    示例

    示例说明

    [['列名1', '列名2',…]]

    按列名选择单列或多列

    In: print(data2[['col1','col2']])

    Out:    col1 col2

    0     2     a

    1     1     b

    2     0     a

    选择data2的col1和col3两列

    [m:n]

    选择行索引在m到n间的记录

    In:  print(data2[0:2])

    Out:       col1 col2  col3

    0     2     a  True

    1     1     b  True

    选取行索引在[0:2)中间的记录,不包含2

    iloc[m:n]

    In: print(data2.iloc[0:2])

    Out:       col1 col2  col3

    0     2     a  True

    1     1     b  True

    iloc[m:n,j:k]

    选择行索引在m到n且列索引在j到k间的记录

    In:  print(data2.iloc[0:2,0:1])

    Out:          col1

    0     2

    1     1

    选取行索引在[0:2)列索引在[0:1)中间的记录,行索引不包含2,列索引不包含1

    loc[m:n,[  '列名1', '列名2',…]]

    选择行索引在m到n间且列名为列名1、列名2的记录

    In:  print(data2.loc[0:2,['col1','col2']])

    Out:    col1 col2

    0     2     a

    1     1     b

    2     0     a

    选取行索引在[0:2)之间,列名为'col1'和'col2'的记录,行索引不包含2

    提示 如果选择特定索引的数据,直接写索引值即可。例如data2.loc[2,['col1','col2']]为选择第三行且列名为'col1'和'col2'的记录。

    4 数据筛选和过滤

     

    数据筛选和过滤是基于条件的数据选择,本章2.6.3提到的比较运算符都能用于数据的筛选和选择条件,不同的条件间的逻辑不能直接用and、or来实现且、或的逻辑,而是要用&和|实现。常用方法如表4所示:

    表4 Pandas常用数据筛选和过滤方法

    方法

    用途

    示例

    示例说明

    单列单条件

    以单独列为基础选择符合条件的数据

    In:  print(data2[data2['col3']==True])

    Out:    col1 col2   col3

    0     2     a  True

    1     1    b   True

    选择col3中值为True的所有记录

    多列单条件

    以所有的列为基础选择符合条件的数据

    In:  print(data2[data2=='a'])

    Out:    col1 col2   col3

    0   NaN     a   NaN

    1   NaN   NaN   NaN

    2   NaN     a   NaN

    选择所有值为a的数据

    使用“且”进行选择

    多个筛选条件,且多个条件的逻辑为“且”,用&表示

    In:  print(data2[(data2['col2']=='a') & (data2['col3']==True)])

    Out:    col1 col2   col3

    0     2     a  True

    选择col2中值为a且col3值为True的记录

    使用“或”进行选择

    多个筛选条件,且多个条件的逻辑为“或”,用|表示

    In:  print(data2[(data2['col2']=='a') | (data2['col3']==True)])

    Out:      col1 col2   col3

    0     2     a   True

    1     1     b   True

    2     0     a  False

    选择col2中值为a或col3值为True的记录

    使用isin查找范围

    基于特定值的范围的数据查找

    In:  print(data2[data2['col1'].isin([1,2])])

    Out:    col1 col2   col3

    0     2     a  True

    1     1     b  True

    筛选col1列值为1或2的记录

    query

    按照类似sql的规则筛选数据

    In:  print(data2.query('col2=="b"'))

    Out:    col1 col2   col3

    1     1     b     1

    筛选数据中col2值为b的记录

    5 数据预处理操作

     

    Pandas的数据预处理基于整个数据框或Series实现,整个预处理工作包含众多项目,本节列出通过Pandas实现的场景功能。本节功能具体如表5所示:

    表5 Pandas常用预处理方法

    方法

    用途

    示例

    示例说明

    T

    转置数据框,行和列转换

    In:  print(data2.T)

    Out:      0   1  2

    col1  2   1  0

    col2  a   b  a

    行索引、列名以及数据相互调换

    sort_values

    按值排序,默认为正序,可通过ascending=False指定倒序排序

    In: print(data2.sort_values(['col1']))

    Out:   col1 col2

    2     0     a

    1     1     b

    0     2     a

    按colo1列排序

    sort_index

    按索引排序,默认为正序,可通过ascending=False指定倒序排序

    In:  print( data2.sort_index(ascending=False))

    Out:    col1 col2   col3

    2     0     a     0

    1     1     b     1

    0     2     a     1

    按索引倒序排序

    dropna

    去掉缺失值,可通过axis设置为0或  index、1或columns丢弃带有缺失值的行或列

    In:  print(data2.dropna())

    Out:    col1 col2   col3

    0     2     a   True

    1     1     b   True

    2     0     a  False

    直接丢弃带有缺失值的行

    fillna

    填充缺失值,可设置为固定值以及不同的填充方法

    In:  print(data2.fillna(method='bfill'))

    Out:    col1 col2   col3

    0     2     a   True

    1     1     b   True

    2     0     a  False

    使用下一个有效记录填充缺失值

    astype

    转换特定列的类型

    In:  data2['col3'] = data2['col3'].astype(int)

    In:  print(data2.dtypes)

    Out:  col1     int64

    col2    object

    col3     int32

    dtype:  object

    将col3转换为int型

    rename

    更新列名

    In:  print(data2.rename(columns=
     {'col1':'A','col2':'B','col3':'C'}))

    Out:    A   B  C

    0  2   a  1

    1  1   b  1

    2  0   a  0

    将data2的列名更新为A、B、C

    drop_duplicates

    去重重复项,通过指定列设置去重的参照

    In:  print(data2.drop_duplicates(['col3']))

    Out:    col1 col2   col3

    0     2     a     1

    2     0     a     0

    按col3列去重重复记录

    replace

    查找替换

    In:  print(data2.replace('a','A'))

    Out:    col1 col2   col3

    0     2     A     1

    1     1     b     1

    2     0     A     0

    将小写字符a替换为大些字母A

    sample

    抽样

    In:  print(data2.sample(n=2))

    Out:    col1 col2   col3

    0     2     a     1

    1     1     b     1

    从data2中随机抽取2条数据

    6 数据合并和匹配

     

    数据合并和匹配是将多个数据框做合并或匹配操作。具体实现如表6所示:

    表6 Pandas常用数据合并和匹配方法

    方法

    用途

    示例

    示例说明

    merge

    关联并匹配两个数据框

    In:  print(data2.merge(data1,on='col1',how='inner'))

    Out:    col1 col2_x  col3_x   col2_y  col3_y  col4

    0    1      b      1      2      3   4

    关联data1和data2,主键分别为a列和col1列,内关联方式

    concat

    合并两个数据框,可按行或列合并

    In: print(pd.concat((data1,data2),axis=1))

    Out:  col1 col2   col3  col4  col1 col2 col3

    0   1    2   3   4      2    a     1

    1   6    7   8   9      1    b     1

    2  11   12  13  14      0    a     0

    按列合并data1和data2,可通过指定axis=0按行合并

    append

    按行追加数据框

    In:  print(data1.append(data2))

    Out:   col1 col2   col3  col4

    0     1     2     3   4.0

    1     6     7     8   9.0

    2    11    12    13  14.0

    0     2     a     1   NaN

    1     1     b     1   NaN

    2     0     a     0   NaN

    将data2追加到data,等价于pd.concat((data1,data2),
     axis=0)

    join

    关联并匹配两个数据框

    In:  print(data1.join(data2,lsuffix='_d1', rsuffix='_d2'))

    Out:  col1_d1   col2_d1  col3_d1  col4   col1_d2 col2_d2  col3_d2

    0   1    2   3   4     2  a  1

    1   6    7   8   9     1  b  1

    2  11   12  13  14     0  a  0

    将data1和data2关联,设置关联后的列名前缀分别为d1和d2

    7 数据分类汇总

     

    数据分类汇与Excel中的概念和功能类似。具体实现如表7所示:

    表7 Pandas常用数据分类汇总方法

    方法

    用途

    示例

    示例说明

    groupby

    按指定的列做分类汇总

    In:  print(data2.groupby(['col2'])['col1'].sum())

    Out:  col2

    a    2

    b    1

    Name:  col1, dtype: int64

    以col2列为维度,以col1列为指标求和

    pivot_table

    建立数据透视表视图

    In: print(pd.pivot_table(data2,index=['col2']))

    Out:       col1   col3

    col2

    a        1    0.5

    b        1    1.0

    Name:  col1, dtype: int64

    以col2列为索引建立数据透视表,默认计算方式为求均值

    8 高级函数使用

     

    Pandas能直接实现数据框级别高级函数的应用,而不用写循环遍历每条记录甚至每个值后做计算,这种方式能极大提升计算效率,具体如表8所示:

    表8 Pandas常用高级函数

    方法

    用途

    示例

    示例说明

    map

    将一个函数或匿名函数应用到Series或数据框的特定列

    In:  print(data2['col3'].map(lambda x:x*2))

    Out:  0    2

    1    2

    2    0

    Name:  col3, dtype: int64

    对data2的col3的每个值乘2

    apply

    将一个函数或匿名函数应用到Series或数据框

    In:  print(data2.apply(pd.np.cumsum))

    Out:    col1 col2   col3

    0     2    a      1

    1     3    ab     2

    2     3   aba     2

    将data2的所有列按行(默认)做累加

    agg

    一次性对多个列做聚合操作

    In:  import numpy as np

    In:  print(data2.groupby(['col2']).agg(
     {'col1':np.sum,'col3':np.mean}))

    Out:    col1   col3

    col2

    a     2    0.5

    b     1    1.0

    在data2中以col2为维度,对col1求和,col3求均值

  • 相关阅读:
    bzoj2683简单题 cdq分治
    bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
    bzoj1767[Ceoi2009]harbingers 斜率优化dp
    bzoj2753[SCOI2012]滑雪与时间胶囊 最小生成树
    bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
    刷题总结——pole(uva 1638 dp)
    刷题总结——分配笔名(51nod1526 trie树)
    刷题总结——树有几多愁(51nod1673 虚树+状压dp+贪心)
    刷题总结——book of evil(codefoeces 337D)
    刷题总结——解方程(NOIP2014)
  • 原文地址:https://www.cnblogs.com/xdlzs/p/11303410.html
Copyright © 2020-2023  润新知