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