DataFrame算术-映射-Pandas数据清洗

tech2025-05-18  13

DataFrame算术

实际上,通过 + - * / // ** 等符号可以直接对DataFrame与DataFrame之间或者DataFrame以及Series之间进行运算。但秉承的原则就是对应索引运算,存在索引不同时,返回结果为索引对的并集。 但是实际操作会发现,当存在索引不同时,返回的值自动填充NaN。

DataFrame的运算

import pandas as pd import numpy as np df1 = pd.DataFrame(np.ones((2,2)),columns=list("ab")) df2 = pd.DataFrame(np.ones((3,3)),columns=list("abc")) print(df1) # 2*2 print(df2) # 3*3 # df1 与 df2 形状完全不一致 是否可以进行运算? df1 + df2 # 未报错。并集:索引相同部分运算,缺失部分填充为np.nan """ DF 与 Series """ # 结构一致 s = df2.iloc[0,:] # (3,) 与 (3,3) print(s) print(df2) df2 + s # 进行0轴广播 # 结构完全不同 s2 = pd.Series(np.arange(15,20)) # (5,) (3,3) print(s2) print(df2) s2 + df2 # 并集:全部填充NaN

使用填充值的算术方法

方法描述add加法(+)sub减法(-)div除法(/)floordiv整除(//)mul乘法(*)pow幂次方(**)

算术方法

df1.add(df2,fill_value=2) # fill_value是填充再有缺失值的数组,也就是说 2.0+1.0=3.0 df2.add(s) df2.add(s2)

注意 • Series使用算术方法,不支持指定填充值

函数应用于映射

通过 apply 将函数运用到列 或者 行 • df.apply(func, axis=0)

""" 需求:取出数组中每行的最大值 """ # 生成4*4的服从均匀分布的数组 df = pd.DataFrame(np.random.uniform(-10,10,size=(4,4))) df # 法1 # df.max(axis=1) # 法2 # 可以每行每行的取出来,然后传到max()里面进行运用,得到结果 f = lambda x:x.max() df.apply(f,axis=1)

applymap将函数应用到每个数据上 • df.applymap(func)

""" 需求:每一个元素只保留两位小数 """ f2 = lambda x:"%.2f"%x df.applymap(f2)

DataFrame排序

索引排序 • df.sort_index(axis=0,ascending=True) • axis指定轴,默认为0轴 • ascending为排序方式,默认为True表示升序

df5 = pd.DataFrame(np.arange(12).reshape(3,4)) df5 """ 索引排序 """ df5.sort_index(ascending=False) # 默认为0轴 并且默认为升序 df6 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("bca")) df6 # 当索引为字符串时,根据ascii排序 通过ord()来查看ascii值 df6.sort_index() # axis参数默认为0 指定axis=1 df6.sort_index(axis=1,ascending=False) # 将 0 赋值为 10 df6.iloc[0,0] = 10 df6

值排序 • df.sort_values(by) • by指定一列或多列作为排序键

# 通过by指定0列进行排序 默认升序排序 df6.sort_values(by=0) # 默认降序排序 # df6.sort_values(by=0,ascending=False) df6.sort_values(by=[0,1]) # 没有明显的效果 df6.iloc[1,0] = 8 df6 """ 多列排序 比如:by=[col1,col2] 是先给col1排序 当col1有相同值时,col2中按排序顺序再排序 """ df6.sort_values(by=[0,1]) # 指定轴 df6.sort_values(axis=1,by="c")

注意 • by = [col1,col2] 是先给col1排序 当col1有相同值时,col2中按排序顺序再排序

描述性统计的概述和计算

代码如下:

df7 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc")) df7 df7.count() # 计算非NaN的个数 df7.min() # 计算最小值 df7.max() # 计算最大值 df7.idxmin() # 最小值所在的标签 df7.idxmax() # 最大值所在的标签 df7.sum() # 进行求和运算 df7.mean() # 求平均值 df7.median() # 求中位数 df7.var() # 求方差 df7.std() # 求标准差 df7.cumsum() # 求累积值 df7.cummin() # 求累积最小值 df7.cummax() # 求累积最大值 df7.cumprod() # 求值的累积积 df7.diff() # 计算第一个算术差值(时间序列) (后一日-前一日) 例如:4 - 0 = 4,5 - 1 = 4 df7.pct_change() # 百分比 (后一日-前一日)/前日 增长率 例如: (5 - 1) / 1 = 4 df7[1].corr(df7[2]) # 计算两个 series 数组之间的相关性 (按索引对其的值的相关性) df7.cov() # 求协方差

补充:

df7.sum() # 按照0轴 求和 df7.sum(axis=1) # 按照1轴 求和 df7.iloc[1,[1,2]] = np.nan df7 df7.sum() # skipna跳过na df7.sum(skipna=False) df7.describe() # 需求的统计数值的结果

Pandas数据清洗

数据清洗介绍 数据清洗实际上也是数据质量分析,检查原始数据中是否存在脏数据(不符合要求,或者不能直接进行分析的数据),并且处理脏数据。

常见情况如下 • 缺失值 • 异常值 • 重复数据 • 不一样的值

处理缺失值

Pandas使用浮点值NaN(not a Number)表示缺失值,并且缺失值在数据中时常出现。那么Pandas的目的之一就是"无痛地"处理缺失值。

判断数据是否为NaN • pd.isnull(df) 返回哪些值是缺失值的布尔值 • pd.notnull(df) 返回值是isnull的反集

import pandas as pd import numpy as np df = pd.DataFrame(np.arange(12).reshape(3,4)) df.iloc[1,1] = np.nan df pd.isnull(df) # 数组元素中是NaN --》True pd.notnull(df) # 数组元素中不是NaN --》True # python内建的 None 也会被当中NaN df.iloc[1,2] = None df

注意 • Python内建的None值也被当作NaN

过滤缺失值

dropna(axis=0,how=‘any’,inplace=False) • axis 指定轴 默认为0 代表行 • how 默认为any 代表删除含有NaN的行 当为all 时代表删除所有值为NaN的行 • inplace 修改被调用的对象 而不是一个备份

Seires过滤缺失值

""" Seires """ s = pd.Series([1,np.nan,2,3,4,np.nan]) s # 布尔索引 # s[s.notnull()] # 取出不是NaN的数据 布尔索引过滤 s.dropna() # s.dropna()直接过滤缺失值

DataFrame过滤缺失值

""" DataFrame - df.dropna() """ df = pd.DataFrame(np.arange(16).reshape(4,4)) df df.iloc[1,:] = np.nan # 选择索引为1的这行赋值为nan df.iloc[3,1] = np.nan # 13赋值为nan df df.dropna() # 1.axis=0, 2.只要含有nan就删除 # 指定1轴 df.dropna(axis=1) df.dropna(axis="columns") # 只删除全部为nan的行 df.dropna(how="all")

补全缺失值(NaN)

df.fillna(value=None,method=None,axis=None,inplace=False,limit=None) • value 标量或字典对象用于填充缺失值 • method 插值方法 默认为"ffill" • axis 需填充的轴 默认为0 • inplace 修改被调用的对象 而不是一个备份 • limit 用于向前或向后填充时最大的填充范围

Seires补全缺失值

# 给series对象的nan填充2 s.fillna(2)

DataFrame补全缺失值

""" DataFrame """ df1 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("WXYZ")) df1.iloc[1,[1,2]] = np.nan df1 # 将nan填充为2 df1.fillna(2) # X列的nan填充为3.0 Y这列的nan填充为4.0 df1.fillna({"X":3.0,"Y":4.0}) # 插值填充 df1.fillna(method="ffill") # 类似于excel的拖动复制 插值 df1.iloc[2,[1,2]] = np.nan df1 df1.fillna(method="ffill",limit=1) # limit 作为插值填充的限制 只填充1行 # 填充平均值 df1.mean() df1["Y"].mean() df1["X"].mean() df1.fillna(df1.mean())
最新回复(0)