对数据框中的数据进行处理,使数据格式满足业务需求。
一,增加列或删除列
向数据框中增加新列或删除列,各有两种方法。
1,简单方法
通过为一个新列赋值来向数据框中增加新列,新列始终处于列的末尾:
>>> df['new']='a'
通过del 命令来删除数据框中的列:
>>> del df['new']
2,插入新列
使用insert()函数向数据框中插入新列,可以指定新列的位置:
DataFrame.insert(self, loc, column, value, allow_duplicates=False)
参数注释:
- loc:int,插入列的位置,该位置索引必须0 <= loc <= len(columns)
- column:插入列的名称
- value:插入列的值,可以是单个标量值,插入列的值都是相同的;可以是序列或array-like,为每一行的列设置一个值。
- allow_duplicates :是否允许列重名,默认值是False,不允许。
举个例子,向df的末尾插入一列,列值都是a:
>>> df.insert(3,'new','a')
3,使用drop()函数删除行或列
使用drop()函数来删除行或列:
DataFrame.drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
参数注释:
- labels:要删除的行标签或列标签
- axis:轴,0 或 ‘index’ 表示行, 1 或 ‘columns’表示列,default 0,
- index:设置index=drop_labels 等价于设置 labels=drop_labels和 axis=0
- columns:设置columns=drop_labels 等价于设置 labels=drop_labels和 axis=1
- level:int或 level name,对于MultiIndex,删除参数level指定的索引
举个例子,把df的列new删除:
>>> df.drop(labels='new',axis=1)
二,列数据类型转换
astype(dtype) 函数用于把数据框的列转换为特定的类型,dtype可以是pandas支持的类型,也可以是numpy.dtype,也可以是Python类型:
把数据框的列改变为字符串类型,str是python类型,'object'是pandas支持的字符串类型:
df['col_name'].astype(str) df['col_name'].astype('object')
其他转换类型的函数
使用Pandas提供的函数如to_numeric()、to_datetime()
三,处理缺失值
pandas支持缺失值的检测、删除和填充,缺失值NA是指数值类型的NaN和None,NaN可以使用numpy.nan来设置。
from numpy import nan as NA
1,检测缺失值
检测数据框的缺失值,如果某一个cell为NA值,那么在该Cell所在的位置上显示为True。
DataFrame.isna(self) DataFrame.notna(self)
2,删除缺失值
当检测到行或列中包含缺失值时,可以删除改行或该列:
DataFrame.dropna(self, axis=0, how='any', thresh=None inplace=False)
参数注释:
axis: 轴,默认值是0。0和index表示行,当行中任意列包含缺失值时,删除该行;1或columns表示列,当列中包含缺失值时,删除改行。
how:默认值是any,表示当轴(axis)中出现任意一个缺失值时,删除该轴;如果设置为all,表示只有轴中的所有值都缺失时,才会删除该轴。
thresh:默认值是None,当出现多少个有效值,不认为是缺失
3,填充缺失值
使用特定的值或方法来填充缺失值:
DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs) DataFrame.interpolate(self, method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, downcast=None, **kwargs)
四,排序
pandas可以按照索引来排序,也可以按照值来排序。
1,按照列值来排序
使用sort_values()函数,按照列值进行排序:
DataFrame.sort_values(self, by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
参数注释:
- by:str 或 list of str,如果axis=0,by指定的是行标签,函数按照行标签来排序,如果axis=1,by指定的是列名,函数按照列标签来排序
- axis:0或index表示行,1或columns表示列
- kind:排序的算法,默认值是quicksort,有效的排序算法有:‘quicksort’, ‘mergesort’, ‘heapsort’
- na_position :有效值是 ‘first’, ‘last’, default ‘last’,表示NA的位置。
2,按照索引排序
按照索引列进行排序:
DataFrame.sort_index(self, axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
参数注释:
- level:对于MultiIndex,通过参数level来指定索引的级别或name
- sort_remaining:bool,default True,对于MultiIndex,是否把其他级别的索引也同步排序。
五,长宽格式的转换
宽格式是指:一列或多列作为标识变量(id_vars),其他变量作为度量变量(value_vars),直观上看,这种格式的数据比较宽,举个列子,列名是:id1、id2、var1、var2、var3,一行可以表示多个度量变量的值。
而长格式是指在一行中,除了标识变量(id_vars),其他列是variable和name,从宽格式转换为长格式,会使得数据行数增加,直观上看,这种格式的数据比较长,举个例子,列名是:id1、id2、variable、value,一行只表示一个度量变量的值。
在宽格式转换为长格式的过程中,宽格式中的多个度量变量进行了分裂,使得长格式中的每一行,实际上,只表示一个度量变量的值。
有如下宽数据:
>>> df = pd.DataFrame({'idA': {0: 'a', 1: 'b', 2: 'c'}, ... 'varB': {0: 1, 1: 3, 2: 5}, ... 'varC': {0: 2, 1: 4, 2: 6}}) >>> df idA varB varC 0 a 1 2 1 b 3 4 2 c 5 6
1,融合数据(melt)
把数据从宽格式转换为长格式
DataFrame.melt(self, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
参数注释:
- id_vars:作为标识变量的列
- value_vars:作为值的列
- var_name:默认值是variable,对长格式中度量变量的列名所在的列进行命名
- value_name:默认值是value,对长格式中度量变量的列值所在的列进行命名
- col_level:如果列是MultiIndex,使用这个level的索引进行melt
举个例子,把示例中的宽数据转换为长数据,id列是idA,度量变量是varB,得到如下长数据:
>>> df.melt(id_vars='idA',value_vars='varB') idA variable value 0 a varB 1 1 b varB 3 2 c varB 5
id列是idA,度量变量是varB和varC,得到如下长数据:
>>> df.melt(id_vars='idA',value_vars=['varB','varC']) idA variable value 0 a varB 1 1 b varB 3 2 c varB 5 3 a varC 2 4 b varC 4 5 c varC 6
2,重塑数据(pivot)
把数据从长格式转换为宽格式,返回按照特定的index或column重塑的DataFrame:
DataFrame.pivot(self, index=None, columns=None, values=None)
参数注释:
- index:用于创建新DataFrame的索引,相当于分组列,相同索引的行称为一个小分组。
- columns:根据columns指定的列值来创建新DataFame的列名,使用该参数指定的列来创建结果的列名。
- values:和columns对应,表示相应列的列值,用于填充结果列的列值
重塑数据的流程:
- 根据index的唯一值进行分组,
- 把columns指定的列的唯一值作为结果的列名,即,列的值作为结果的列名
- 把values对应的列值作为新列名的值,即,把列的值作为结果中对应列的值
举个例子,有如下长格式的数据:
>>> df=df.melt(id_vars='idA',value_vars=['varB','varC']) >>> df idA variable value 0 a varB 1 1 b varB 3 2 c varB 5 3 a varC 2 4 b varC 4 5 c varC 6
使用pivot把长格式转换为宽格式,按照idA列进行分组,把variable的列值作为结果的列名,把values的列值作为结果列的值:
>>> df.pivot(values='value',columns='variable',index='idA') variable varB varC idA a 1 2 b 3 4 c 5 6
重塑的数据包含行索引idA,列标签varB和varC,其中variable是列标签的name。
使用reset_index()函数把行索引转换为列,其中variable是列索引的名称:
>>> df.pivot(values='value',columns='variable',index='idA').reset_index() variable idA varB varC 0 a 1 2 1 b 3 4 2 c 5 6
六,透视表(pivot_table)
透视表是指按照特定的index和columns进行聚合操作之后的表,该函数和pivot函数的行为相似,只不过会对值进行聚合操作:
DataFrame.pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)
参数注释:
- values:聚合的列
- index:分组器,作为结果的索引
- columns:分组器,作为结果的列
- aggfunc:聚合的函数
- fill_value:用于填充缺失值的值
- margins:bool,默认值是True,把所有行或列的值加和,计算subtotal(小组和)或grand total(总合)
- margins_name:str,默认值是All,当margins为Ture时,为每个汇总设置名称。
- observed:boolean, default False,仅适用于分组器是分类索引的。
例如,对长数据进行重塑,获得透视表:
>>> df.pivot_table(values='value',index='idA',columns='variable',aggfunc='mean') variable varB varC idA a 1 2 b 3 4 c 5 6
参考文档: