pandas 学习 第9篇:DataFrame 数据处理(操作列、类型转换、缺失值、排序、长宽格式、透视表)

对数据框中的数据进行处理,使数据格式满足业务需求。

一,增加列或删除列

向数据框中增加新列或删除列,各有两种方法。

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)

把包含缺失值的行显示出来:

df_na = df[df.isna().any(axis=1)]

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

 

 

 

参考文档:

pandas DataFrame

posted @ 2019-09-26 18:15 悦光阴 阅读(...) 评论(...) 编辑 收藏