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)