pandas 学习 第10篇:DataFrame 数据处理(应用、追加、截断、连接、合并、重复值、重索引、重命名、重置索引、设置轴索引、选择和过滤)

DataFrame的这些操作和Series很相似,这里简单介绍一下。

一,应用

apply()函数应用于轴级别,applymap应用于元素级别:

DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)
DataFrame.applymap(self, func)

定义一个函数fun,使用apply()函数把fun应用到由DataFrame对象的列构成的一维数组上,通常fun函数是由聚合函数构成的。

f=lambda x: x.max()-x.min
df.apply(f)

定义一个函数foo,使用applymap()函数把函数foo应用于DataFrame对象的各个元素上,

foo=lambda x: '%.2f' % x

df.applymap(foo)

转换数据,调用函数对循环对数据元素进行处理:

DataFrame.transform(self, func, axis=0, *args, **kwargs)

二,追加和截断数据行

追加是增加数据框的数据,截断是把数据从数据框中删除。

1,追加

向数据框的末尾追加数据行:

DataFrame.append(self, other, ignore_index=False, verify_integrity=False, sort=None)

也就是把一个结构相同的DataFrame追加到另一个DataFrame的后面,把两个DataFrame合并为一个。

2,截断

可以按照行索引来截断数据,也可以按照列索引来截断数据:

DataFrame.truncate(self, before=None, after=None, axis=None, copy=True)

参数注释:

  • before:把before之前的索引值截断
  • after:把after之后的索引值截断
  • axis:{0 or ‘index’, 1 or ‘columns’}

三,连接

数据框的连接操作类似于关系型数据库中的JOIN操作。

1,自然连接

两个数据框按照on条件进行连接,或按照索引,或按照同名的字段进行连接,按照等值条件进行匹配:

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

参数注释:

  • on:如果设置为None,那么按照行索引来匹配;如果设置为列值,那么两个DataFrame中按照on指定的列进行匹配
  • how:连接的类型,{‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘left’
  • lsuffix:左表同名字段的前缀
  • rsuffix:右表同名字段的前缀

2,合并

类似于关系型数据库的连接操作,和join函数的功能相同,按照等值条件进行匹配,但是用法比join函数更灵活:

DataFrame.merge(self, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

参数注释:

  • right:右表
  • how:{‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’
  • on:连接的条件,要求按照同名字段进行匹配
  • left_on、right_on:分别指定左表和右表的来连接字段,字段的顺序是有意义的
  • left_index、right_index:分别指定左表和右表的索引,按照索引来匹配
  • suffixes:元组(str,str),分别用于指定左表和右表同名字段的前缀
  • indicator:增加指示器,如果设置为True,增加一列”_merge“
  • validate:检查merge的类型(“one_to_one” or “1:1”,“one_to_many” or “1:m”,“many_to_one” or “m:1”和“many_to_many” or “m:m”)

四,重复值

重复值是指同一列中重复出现的值。

1,检测重复值

函数duplicated用于检测DataFrame的列中是否存在重复值,

DataFrame.duplicated(self, subset=None, keep='first')

subset:列标签,或列标签序列

keep:有效值是‘first’, ‘last’, False, default ‘first’

  • first表示除了第一次之外,把后面出现的重复值标记为True
  • last表示除了最后一次之外,把前面出现的重复值标记为True
  • False表示把重复值都标记为True

2,删除重复值

drop_duplicates()删除包含重复值的数据行

DataFrame.drop_duplicates(self, subset=None, keep='first', inplace=False)

subset:列标签,或列标签序列

keep:有效值是‘first’, ‘last’, False, default ‘first’

  • first表示除了第一次之外,把后面出现的重复值都删除
  • last表示除了最后一次之外,把前面出现的重复值都删除
  • False表示把重复值都删除

五,重索引

 重索引的目的是使原始索引按照新的索引进行排序

DataFrame.reindex(self, labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

参数注释:

  • labels:array-like,新的轴(axis)标签,轴由参数axis指定
  • index,columns:新索引,如果指定index参数,等价于指定labels和axis=0/'index',如果指定columns,等价于指定labels和axis=1/'columns'
  • axis:轴,axis=0/'index'表示行,axis=1/'columns'表示列
  • method:用于填充的方法,有效值是None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’,
    •   None表示不会填充
    •   ‘backfill’/’bfill’:表示回填,用NA的后面第一个有效值来填充当前的NA
    •   ‘pad’/’ffill’:表示补填,用前面第一个有效值来填充当前的NA
    •   ‘nearest’:用最接近NA的有效值来填充当前的NA
  • copy:默认值是True,返回新的对象
  • level:用于MultiIndex,在一个级别上,与MultiIndex进行匹配。
  • fill_value:标量值,默认值是np.NaN,用于对缺失值进行填充的值
  • limit:填充的最大次数
  • tolerance:可选参数,表示不能完全匹配的原始标签和新标签之间的最大距离,匹配位置处的索引值满足:abs(index_position -  target_position)<= tolerance,容差可以是标量值(对所有序列值应用相同的容差),也可以是list-like结构(对每个序列元素应用可变容差),list-like结构包括列表、元组、数组和序列,并且list-like结构的长度和序列的长度和长度必须相同。

六,重命名

重命名轴的标签和轴的name属性

1,重名轴的标签

重命名轴的标签,传递的参数是dict-like对象,key和value是1-to-1的,key表示原始标签,value表示新标签:

DataFrame.rename(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore')

参数注释:

  • mapper:dict-like或函数,用于表示轴标签和新标签的映射,由参数axis来表示重命名哪个轴标签
  • axis:轴,axis=0/'index'表示行,axis=1/'columns'表示列
  • index:dick-like或函数,用于表示行标签和新标签的映射,等价于  axis=0/'index'  和指定mapper参数
  • columns:dick-like或函数,用于表示行标签和新标签的映射,等价于  axis=1/'columns'  和指定mapper参数
  • level:指定MultiIndex的特定级别(level)

2,重命名轴的name属性

轴有name属性,使用rename_axis()重命名轴的name属性:

DataFrame.rename_axis(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False)

参数注释:

mapper:通常情况下是标签纸,表示轴的新name

七,重置索引

 重置索引,默认使用整数索引代替原始索引:

DataFrame.reset_index(self, level=None, drop=False, inplace=False, col_level=0, col_fill='')

参数注释:

  • level:只移除给定level的索引,默认值是移除所有索引。当drop=False时,表示把给定level的索引转换为列;当drop=True,把给定的索引从DataFrame对象中删除。
  • drop:默认值是False,不删除原始索引,而是把索引插入到DataFrame中,作为一个列。如果设置为True,删除原始索引。
  • col_level:如果columns有多个级别(multiple levels),确定把标签插入到哪个级别,默认插入第一级。
  • col_fill:如果columns有多个级别(multiple levels),确定其他级别如何命名。

 例如,创建多级的行索引和列索引,如下所示,行索引是2级别的,两个级别的名称分别是class和name;列索引也是2级的,列索引两个级别都是匿名的。

>>> index = pd.MultiIndex.from_tuples([('bird', 'falcon'),
...                                    ('bird', 'parrot'),
...                                    ('mammal', 'lion'),
...                                    ('mammal', 'monkey')],
...                                   names=['class', 'name'])
>>> columns = pd.MultiIndex.from_tuples([('speed', 'max'),
...                                      ('species', 'type')])
>>> df = pd.DataFrame([(389.0, 'fly'),
...                    ( 24.0, 'fly'),
...                    ( 80.5, 'run'),
...                    (np.nan, 'jump')],
...                   index=index,
...                   columns=columns)
>>> df
               speed species
                 max    type
class  name
bird   falcon  389.0     fly
       parrot   24.0     fly
mammal lion     80.5     run
       monkey    NaN    jump

把class级别的行索引转换为列,插入到列索引的级别1中:

>>> df.reset_index(level='class', drop=False, col_level=1)
                speed species
         class    max    type
name
falcon    bird  389.0     fly
parrot    bird   24.0     fly
lion    mammal   80.5     run
monkey  mammal    NaN    jump

查看DataFrame的多级列,新插入的列'Class'在另一个level上是没有列名的,这可以通过设置col_fill参数来为另一个level上的列名赋值:

>>> df.reset_index(level='class', drop=False, col_level=1).columns
MultiIndex([(       '', 'class'),
            (  'speed',   'max'),
            ('species',  'type')],
           )

修改新加的列在其他level的列名:

>>> df.reset_index(level='class', col_level=1, col_fill='genus')
                genus  speed species
                class    max    type
name
falcon           bird  389.0     fly
parrot           bird   24.0     fly
lion           mammal   80.5     run
monkey         mammal    NaN    jump

八、设置轴的索引

设置轴的索引,可以使用set_index()函数把已有的列转换为行索引,也可以使用set_axis()函数替换掉已有的轴索引。

1,把已有的列转换为行索引

使用现有的列作为DataFrame的索引:

DataFrame.set_index(self, keys, drop=True, append=False, inplace=False, verify_integrity=False)

参数注释:

  • keys:列标签,或列标签的列表,
  • drop:默认值是True,表示删除keys参数指定的列;设置为False,表示不删除keys参数指定的列。
  • append:默认值是False,表示删除原始行索引;如果设置为True,表示向现有的行索引中追加索引。
  • verify_integrity:默认值是False,不检查新索引是否存在重复值。

2,替换原始索引 

把给定的轴的索引替换为新索引:

DataFrame.set_axis(self, labels, axis=0, inplace=None)

参数注释:

  • labels:新索引的值
  • axis:{0 or ‘index’, 1 or ‘columns’}, default 0,指定用于更新的轴
  • inplace:是否原地更新

使用新的索引来替换原始的行索引:

>>> df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
>>> df.set_axis(['a', 'b', 'c'], axis='index', inplace=False)
   A  B
a  1  4
b  2  5
c  3  6

九,选择和过滤

选择是指通过轴索引来选择数据,而过滤是指按照轴标签(完全匹配、模糊匹配和正则匹配)来过滤数据。

1,选择

选择Top N行、尾部N行、或者从给定的位置处返回数据:

DataFrame.head(self, n=5)
DataFrame.tail(self, n=5)
DataFrame.take(self, indices, axis=0, is_copy=True, **kwargs)

举个例子,返回从行索引为0和3的数据行:

df.take([0, 3])

2,过滤

也可以使用正则表达式、模糊匹配等方式,从数据框的轴标签中匹配值,返回数据:

DataFrame.filter(self, items=None, like=None, regex=None, axis=None)

参数注释:

  • items:指定轴标签,返回特定索引值的轴
  • axis:指定轴是行还是列,默认值None是指'columns',从列中过滤值。如果axis是'index',那么返回的是序列;如果axis是'columns',那么返回的是数据框。
  • like:轴标签模糊匹配
  • regex:使用正则表达式来匹配轴标签

 

 

参考文档:

pandas DataFrame

posted @ 2019-10-08 13:43 悦光阴 阅读(...) 评论(...) 编辑 收藏