当前位置:   article > 正文

【Python】pandas:替换值、添加行/列,删除行/列,更改形状(含数据透视表)

【Python】pandas:替换值、添加行/列,删除行/列,更改形状(含数据透视表)

 pandas是Python的扩展库(第三方库),为Python编程语言提供 高性能、易于使用的数据结构和数据分析工具。

pandas官方文档:User Guide — pandas 2.2.2 documentation (pydata.org)

帮助:可使用help(...)查看函数说明文档(若是第三方库的函数,需先导入库)。例如:help(pd.DataFrame),help(pd.concat)


Python代码中,导入pandas:

import pandas as pd


1、替换值:replace, where, mask

(1-1)替换指定数据:replace

replace(self, to_replace=None, value=<no_default>, inplace: 'bool' = False, limit=None, regex: 'bool' = False, method: 'str | lib.NoDefault' = <no_default>)

注:默认inplace=False 不替换原DataFrame。

  • DataFrame.replace(旧值, 新值):将旧值都替换成新值。旧值和新值都可以是单个数据、列表、字典。
  • DataFrame.replace(旧值, 新值,limit=替换个数):将指定个数的旧值替换成新值。旧值和新值都可以是单个数据、列表、字典。
  • 注:若旧值新值都是列表,则列表长度相同,旧值新值一一对应。

  •  DataFrame.replace(正则表达式, 新值, regex=True):将正则表达式匹配的数据替换成新值。
  •  DataFrame.replace(regex=正则表达式, value=新值):将正则表达式匹配的数据替换成新值。
  • 注:正则表达式只能匹配字符串,对数值不适用,除非数值是字符串类型。

  • DataFrame.replace(np.nan, 新值):将NaN值都替换成新值。

  • DataFrame.replace(旧值, np.nan):将旧值都替换成NaN值。

  • 注:np.nan需导入numpy(import numpy as np)。

(1-2)替换布尔为False的值:where

where(self, cond, other=<no_default>, inplace=False, axis=None, level=None, errors='raise', try_cast=<no_default>)

注:默认不满足条件(False)替换为NaN,inplace=False 不替换原DataFrame。

  • DataFrame.where(条件):DataFrame中每个元素,判断是否满足条件,若满足条件则为原数据,若不满足条件则默认替换为NaN。
  • DataFrame.where(条件, 指定值):DataFrame中每个元素,判断是否满足条件,若满足条件则为原数据,若不满足条件则替换为指定值。
  • 注:df1.where(条件, df2) 等同于 np.where(条件, df1, df2),np.where需导入numpy(import numpy as np)。

  • DataFrame.where(Series, 指定值):Series中元素都是布尔(True/False),DataFrame中每个元素,根据Series,若True则为原数据,若False则替换为指定值。若DataFrame行数大于Series元素数量,Seires没有对应的布尔,则默认为False。
  • DataFrame.where(列表, 指定值):列表(底层是数组)中元素都是布尔(True/False),DataFrame中每个元素,根据列表,若True则为原数据,若False则替换为指定值。数组形状必须和DataFrame形状相同,否则报错:ValueError: Array conditional must be same shape as self。

(1-3)替换布尔为True的值:mask

mask(self, cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=<no_default>)

注:默认other=nan 满足条件(True)替换为NaN,inplace=False 不替换原DataFrame。

  • DataFrame.where(...)与DataFrame.mask(...)相反。
  • DataFrame.mask(条件):DataFrame中每个元素,若满足条件(True)则替换为指定值(默认替换成NaN),不满足条件(False)则为原数据。


 2、添加行/列:[ ] , insert, loc, concat

(2-1)添加列(最右侧):[ ]

  • DataFrame[新列名] = 数值:在最右侧添加一列,若数值为单个数据,则整列都为指定数值。新列数值也可以是其他列的计算结果。
  • 注:若列名为已有列名,则相当于修改该列数据。

 (2-2)添加列(指定位置):insert

insert(self, loc: 'int', column: 'Hashable', value: 'Scalar | AnyArrayLike', allow_duplicates: 'bool' = False) -> 'None'

  • DataFrame.insert(添加位置, 新列名, 列数值):在指定位置添加一列,列索引位置从0开始。列名不能和已有列名重复。
  • DataFrame.insert(添加位置, 新列名, 列数值, allow_duplicates=True):在指定位置添加一列,列索引位置从0开始。列名允许和已有列名重复。
  • 注:若列数值是Series,且Series有自己的索引,则列数值是DataFrame索引和Series索引共同对应的数据,没有为NaN。

(2-3)添加行/列(在最后):loc

  • DataFrame.loc[新索引标签] = 数值:在最后添加一行。数值若为单个数据,则整行都是该数据。数值也可以是其他行的计算结果。
  • DataFrame.loc[:, 新列名] = 数值:在最后(最右侧)添加一列。数值若为单个数据,则整列都是该数据。
  • DataFrame.loc[索引标签, 新列名] = 数值:查询/修改指定行列标签对应的数据时,若没有对应的列名,则在最右侧添加该列。
  • 注:若添加行时,索引标签已存在,则修改该行数据。若添加行时,列名已存在,则修改该列数据。

(2-4) 添加行/列(指定位置):concat

concat(objs: 'Iterable[NDFrame] | Mapping[Hashable, NDFrame]', axis: 'Axis' = 0, join: 'str' = 'outer', ignore_index: 'bool' = False, keys=None, levels=None, names=None, verify_integrity: 'bool' = False, sort: 'bool' = False, copy: 'bool' = True) -> 'DataFrame | Series'

注:默认join='outer' 外连接。

  • pd.concat(列表形式):使用列表形式表示需连接的对象,默认按列名从尾部添加,默认使用原索引。
  • pd.concat(列表形式, axis=1):使用列表形式表示需连接的对象,按索引横向添加列,使用原列名。

注意:

  • 指定位置添加行/列,或者添加多行/多列(例如:另一个DataFrame),可用concat将各部分拼接。concat可以与loc或iloc配合使用。
  • 若添加的行数据是Series,需将Series转为DataFrame,且行列转置,才能达到需要的拼接效果。例如:Series.to_frame().T。
  • 添加列,即横向拼接列,需设置axis=1。

补充:两DataFrame合并,可参考:"合并"中的join, merge, append, concat。【Python】pandas:排序、重复值、缺省值处理、合并、分组-CSDN博客


3、删除行/列:pop, drop, concat

(3-1)删除列:pop

pop(self, item: 'Hashable') -> 'Series'

  • DataFrame.pop(列名):删除一列,并输出删除的列。
  • 注:pop 直接在原DataFrame删除。一次只能删除一列。

(3-2)删除行/列(指定标签):drop

drop(self, labels=None, axis: 'Axis' = 0, index=None, columns=None, level: 'Level | None' = None, inplace: 'bool' = False, errors: 'str' = 'raise')

注:默认inplace=False 不替换原DataFrame。

  • DataFrame.drop(列名, axis=1):删除指定列(多列,可用列表表示)。
  • DataFrame.drop(columns=列名):删除指定列(多列,可用列表表示)。
  • DataFrame.drop(columns=列名,inplace=True):删除指定列(多列,可用列表表示),并替换原DataFrame。
  • DataFrame.drop(索引):删除指定行(多行,可用列表表示)。
  • DataFrame.drop(index=索引):删除指定行(多行,可用列表表示)。
  • DataFrame.drop(index=索引, columns=列名):删除指定行指定列(多行或多列,都可用列表表示)。

 drop也可用于删除多索引中的行/列。

  • DataFrame.drop(索引):多索引,默认行索引中删除第一列中指定索引对应的所有行。若用列表表示,则删除多个指定索引对应的所有行。
  • DataFrame.drop(index=索引):多索引,默认行索引中删除第一列中指定索引对应的所有行。若用列表表示,则删除多个指定索引对应的所有行。若用元组表示,则行索引中删除元组对应的索引的所有行。
  • DataFrame.drop(index=索引, columns=列名):删除指定索引对应的所有行以及删除指定列(多行或多列,都可用列表表示)。

(3-3)删除行/列(指定位置):concat

  • 删除指定位置的行/列,可用 loc 或者 iloc切割,再用concat拼接。
  • 注:若切割出的是一行数据(结果是Series),需将Series转为DataFrame,且行列转置,才能达到需要的拼接效果。例如:df.iloc[0].to_frame().T。若一列数据则可直接拼接。

若有重复列名的DataFrame,删除指定行/列,需用iloc通过列索引位置切割,再用concat拼接。简单的,使用iloc就可以获得。


4、更改形状(含数据透视表

 (4-1)不带聚合的数据透视:pivot

pivot(self, index=None, columns=None, values=None) -> 'DataFrame'

  • DataFrame.pivot(作为行索引的列名, 作为列索引的列名, 显示数据的列名):指定某列或多列(列表形式)作为行索引,指定某列或多列(列表形式)作为列索引,指定某列或多列(列表形式)作为数据。
  • 类似于Excel中的数据透视表,但是是不带聚合的透视。

若作为行索引和列索引的条目有重复的,则会报错:ValueError: Index contains duplicate entries, cannot reshape。

(4-2)数据透视表:pivot_table

pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True) -> 'DataFrame'

注:默认dropna=True 若整行都是NaN则删除。

  • pd.pivot_table(DataFrame, values=数据列, index=作为行索引的列,aggfunc=聚合方式):用某列或多列(列表)指定行索引,将指定数据列(用列表表示多列)按指定聚合方式(用字典表示多列各自聚合方式)处理。
  • pd.pivot_table(DataFrame, values=数据列, index=作为行索引的列, columns=作为列索引的列,aggfunc=聚合方式, fill_value=指定值):用某列或多列(列表)指定行索引,用某列或多列(列表)指定列索引,将指定数据列(用列表表示多列)按指定聚合方式(用字典表示多列各自聚合方式)处理,NaN值用指定值填充。

(4-3)取消透视:melt

melt(self, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level: 'Level | None' = None, ignore_index: 'bool' = True) -> 'DataFrame'

  • DataFrame.melt(id_vars=[ 指定列 ], value_vars=[ 指定列 ]):参数id_vars指定作为标识符变量的列,参数value_vars指定取消透视的列。结果:一列数据为标识符变量,一列数据为取消透视的各列名(默认列名为variable),一列数据为对应的数值(默认列名为value)。
  • DataFrame.melt(id_vars=[ 指定列 ], value_vars=[ 指定列 ], var_name=新列名, value_name=新列名):参数id_vars指定作为标识符变量的列,参数value_vars指定取消透视的列,参数var_name给结果中的variable列重新取名,参数value_name给结果中的value列重新取名。
  • DataFrame.melt(id_vars=[ 指定列 ], value_vars=[ 指定列 ], ignore_index=False):参数id_vars指定作为标识符变量的列,参数value_vars指定取消透视的列。使用原索引。

多索引使用melt,指定level行的列名不能相同。

可以使用元组形式表示具体列。

(4-4)将列索引转为行索引:stack

stack(self, level: 'Level' = -1, dropna: 'bool' = True)

注:默认level= -1 将最后一行列索引转为行索引,dropna=True 若整行都是NaN则删除。

  • DataFrame.stack( ): 将最后一行列索引转为行索引。
  • DataFrame.stack(level=指定列索引): 多索引中,指定列索引转为行索引。从上往下level从0开始,最后一个也是-1。可用列表形式表示将多级列索引转为行索引。
  • DataFrame.stack(dropna=False): 将最后一行列索引转为行索引。整行数据都是NaN的也保留。

(4-5)将行索引转为列索引:unstack

unstack(self, level: 'Level' = -1, fill_value=None)

注:默认level= -1 将最后一列行索引转为列索引。

  • DataFrame.unstack( ): 将最后一列行索引转为列索引。
  • DataFrame.unstack(level=指定列索引): 多索引中,指定行索引转为列索引。从左往右level从0开始,最后一个也是-1。可用列表形式表示将多级行索引转为列索引。


(4-6)行轴、列轴交换:(行列转置)

  • DataFrame.swapaxes(0,1):行列转置。
  • DataFrame.transpose( ):行列转置。
  • DataFrame.T:行列转置。


pandas 各函数官方文档:General functions — pandas 2.2.2 documentation (pydata.org)

DataFrame 各方法官方文档:DataFrame — pandas 2.2.2 documentation (pydata.org)

Series 各方法官方文档:Series — pandas 2.2.2 documentation (pydata.org)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/934483
推荐阅读
相关标签
  

闽ICP备14008679号