前言
- 最近工作中经常实用pandas,然而,却发现自己对于pandas的掌握并没有想象中的好,很多pandas的函数和用法,自己都不是特别的熟练,特此总结一下最近经常会使用的pandas用途和函数,增强记忆。
pandas用途之DataFrame遍历
- 按照行对于DataFrame进行遍历,得到每一行,然后对于行进行操作,取每一列的单个数据
for index,row in df.iterrows(): print(row['列名'],row['列名'])
- 如果需要得到每一行的每列的数据进行计算,则需要row[‘列名’].iloc[0]取出行中的单个元素
- 因为,单纯的取出row[‘列名’]是Series类型,会带有Series类型的一些索引等内容。
pandas用途之DataFrame数据查询重复,去除重复
- DataFrame数据查询和取出重复元素,都是根据df.duplicated来实现的
- 使用df.duplicated()来查询重复值,返回布尔类型的值
- 参数:subset,设置判断重复的时候,按照哪些列进行判断。
- 可以使用列表的方式设置,subset = [“列a”,“列b”]
- 可以使用字符串的方式定义,subset = “列a”
- 参数:keep,设置判断重复的时候,保留项
- keep = “first”, 保留第一项
- keep = “last”, 保留最后一项
- keep = False,一个都不保留
- 参数:subset,设置判断重复的时候,按照哪些列进行判断。
- 使用df.drop_duplicates()来删除重复值
- 参数:subset,设置判断重复的时候,按照哪些列进行判断。
- 可以使用列表的方式设置,subset = [“列a”,“列b”]
- 可以使用字符串的方式定义,subset = “列a”
- 参数:keep,设置判断重复的时候,保留项
- keep = “first”, 保留第一项
- keep = “last”, 保留最后一项
- keep = False,一个都不保留
- 参数:subset,设置判断重复的时候,按照哪些列进行判断。
pandas用途之DataFrame数据查询缺失值,去除缺失值
- 查询缺失值
- 使用df.isnull().all(),判断dataframe每一列,哪一列的值全为空
- 使用df.isnull().any(),判断dataframe每一列,哪一列的值有空值
- 也可以单独去判断某一列是不是空值
- df[‘列名’].isnull().any()
- df[‘列名’].isnull().all()
- 使用 np.sum()配合df[‘列名’].isnull()来进行判断某列空值的数量
- 使用 df.info(),可以得到dataframe中每一列的值有多少个,然后非空的值有多少个,是什么类型
- df[df.duplicated(keep=False)], 查看具体是哪些值是重复的
- 删除缺失值
- 使用 df.dropna() 来删除缺失值
- 参数详解:
- how,指定什么情况下可以删除,值的选择有俩个
- any,只要有一个就删除一行
- all, 只有整行都是空值,才会删除
- axis,指定删除行还是删除列
- 0,删除行(默认)
- 1,删除列
- thresh, 指定非空数量,只要某行某列只要是达到这个数量,就保留
- inplace,设置是否就地修改,True 或者 False
- subset, 删除的时候,考虑其他轴方向的子集,比如说,删除行的时候,那么,我们设置 subset = [1,2],那就只会判断1,2俩列
- how,指定什么情况下可以删除,值的选择有俩个
- 填充缺失值
- 使用df.fillna() 来填充固定值
- 参数详解
- value = ‘啥啥啥’,
- 使用固定的值来填充
- 也可以 字典来指定某一列的值,来填充,字典的key指定列标签,值指定value
- value = {3:300,4:300}
- method,俩个值
- ffill,填充上一个有效的值
- bfill,填充下一个有效的值
- limit,限制填充的数量
- 在value的时候, limit是限制的 最大的填充的数量,就是填充的总量
- 在method 的时候,是限制的连续的填充的数量
- inplace,设置是否就地修改
- value = ‘啥啥啥’,
pandas用途之数据异常值、无效值的处理
- 删除处理,实际上就是通过数据的过滤实现,删除超过100,小于0的数据
- df= df[(df[“age”] >= 0) & (df[“age”] <= 100)]
- 按照条件修改为指定的值,< 0 的值,就修改为0,大于100的值,就修改为 100
- df[“age”] = np.where(df[“age”] < 0, 0, df[“age”])
- df[“age”] = np.where(df[“age”] > 100, 100, df[“age”])
数据的过滤与抽取
- 数据的过滤与抽取,目前我了解的有三种方式
- 第一种,利用布尔数组过滤
- new_df = data[data[3] >= 200]
- 第二种,利用query来过滤数据
- df.query(“value1 >= 200 and value1 <= 300”)
- value1为 df中 实际的合法列名
- 第三种,利用sample()来随机抽取数据
- df.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
- n:表示你要随机抽取几行数据,比如你要抽取10行,n=10。不能与frac同时使用
- frac:浮点型,可选。表示抽取数据的百分比,当不确定n的具体值的时候使用。不能与n同时使用
- replace:布尔值,可选。
- 原来的DataFrame是否被抽取的数据替换,默认为False.
- 如果n取值大于原DataFrame的长度, replace为True,可返回结果。
- 否则会因dataFrame长度不够而报错。
- weights:权重,字符串或者数组格式,可选。通过设置不同的权重可以增加相应数据被选中的概率。
- random_state:随机种子数
- axis: 当抽取数据的时候是从行中抽取数据,还是从列中抽取数据。
- 0表示纵向坐标轴
- 1表示横向坐标轴
数据清洗之连续重复值值删除
- 在工作的时候,在删除重复之时,发现,仅仅使用drop_duplicated()无法满足需求,会有一种情况,按照业务的需求,有些列的数据,要是根据时间的发展,重复60次以上的数据才被视为重复数据,删除这样的重复数据,就需要自己去实现,由于时间的原因,自己用了一种很笨的方式,去实现了一下。
- 整体的思路
遍历数据集,用数据集的每一行数据的要去除重复的字段 的值 与之后的行中的值对比,看看是不是连续重复,要是 一直是 连续重复,就记录下来,要是途中发现有一个是不重复的,就跳出,然后下一行,每次每个数字统计完毕之后,都需要看看列表里边的数据,是不是超过我们的设定,要是超过了,就说明当前的这些数据是需要删除的,然后返回索引
# 按照时间排序 context_4 = context_3.sort_values(by='dtime') # 重新设置索引,让行索引从0开始,依序往下 context_5 = context_4.reset_index(drop=True) def chafen(context,key,n): lis = [] # 遍历数据集 for index, row in context.iterrows(): nval = row[key] for i in range(index,context.shape[0]) if (nval- context[key].iloc[i]) == 0: lis.append(i) else : break if len(lis) < n: lis.clear() return lis context_6_1 = context_5.drop(set(chafen(context_5,"Illumination",10)))
数据清洗之上下四分位
- 实际的业务需要,将数据集根据某一个特征进行上下四分位清洗,得到清洗后的数据集
- 第一步,从数据集中得到具体的特征的值
- 第二步,根据特征划分区间
- 生成区间列表,生成0 到 特征的最大值之间,步长为 50的列表
- 生成标签列表,生成对应数量的标签名称,存储着 每个标签名称的列表
- 使用cut函数将特征按照 区间列表对应的名称划分为 不同的区间,实际上是得到了一个Series,里边原本的特征的值全部都 显示为 对应的 区间标签名称
- 给数据集新增以列表,为 替换为标签值的 特征列
- 第三步,将 数据集按照区间列进行 分组,
- 第四步, 按照功率进行上下四分位,
- 第五步, 生成 和 区间数量等长的 数组
- 第六步, 循环遍历标签, 分别将 功率的上下四分位 的数据放入对应的 numpy中
- 第七步, 生成 一个 dataframe,将标签,a25,a75的数据放入
- 第八步,将生成的四分位数据和 原数据集进行合并。 根据区间的标签列合并
- 第九步,真正的开始清洗
- 此时得到的是原本的数据集每一条数据,都打上了标签,是属于哪个类型,以及对应的上下四分位的值,然后我们就可以 实现清洗,只保留大于 a25,以及 小于 a75 的数据