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

Posted ljhdo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于pandas 学习 第10篇:DataFrame 数据处理(应用追加截断连接合并重复值重索引重命名重置索引设置轴索引选择和过滤)的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 学习 第2篇:pandas 的 Series

100天精通Python(数据分析篇)——第55天:Pandas之DataFrame对象大总结

100天精通Python(数据分析篇)——第53天:初始pandas模块

Pandas学习笔记,DataFrame的排序问题

《Pandas Cookbook》第02章 DataFrame基本操作

pandas DataFrame-合并DataFrame与Series