pandas数据清洗,排序,索引设置,数据选取方法
作者:李困困 发布时间:2023-06-13 15:08:45
此教程适合有pandas基础的童鞋来看,很多知识点会一笔带过,不做详细解释
Pandas数据格式
Series
DataFrame:每个column就是一个Series
基础属性shape,index,columns,values,dtypes,describe(),head(),tail()
统计属性Series: count(),value_counts(),前者是统计总数,后者统计各自value的总数
df.isnull() df的空值为True
df.notnull() df的非空值为True
修改列名
df.rename(columns = {'key':'key2'},inplace=True)
更改数据格式astype()
isin #计算一个“Series各值是否包含传入的值序列中”的布尔数组
unique #返回唯一值的数组
value_counts #返回一个Series,其索引为唯一值,值为频率,按计数降序排列
数据清洗
丢弃值drop()
df.drop(labels, axis=1)# 按列(axis=1),丢弃指定label的列,默认按行。。。
丢弃缺失值dropna()
# 默认axi=0(行);1(列),how=‘any'
df.dropna()#每行只要有空值,就将这行删除
df.dropna(axis=1)#每列只要有空值,整列丢弃
df.dropna(how='all')# 一行中全部为NaN的,才丢弃该行
df.dropna(thresh=3)# 每行至少3个非空值才保留
缺失值填充fillna()
df.fillna(0)
df.fillna({1:0,2:0.5}) #对第一列nan值赋0,第二列赋值0.5
df.fillna(method='ffill') #在列方向上以前一个值作为值赋给NaN
值替换replace()
# 将df的A列中 -999 全部替换成空值
df['A'].replace(-999, np.nan)
#-999和1000 均替换成空值
obj.replace([-999,1000], np.nan)
# -999替换成空值,1000替换成0
obj.replace([-999,1000], [np.nan, 0])
# 同上,写法不同,更清晰
obj.replace({-999:np.nan, 1000:0})
重复值处理duplicated(),unique(),drop_duplictad()
df.duplicated()#两行每列完全一样才算重复,后面重复的为True,第一个和不重复的为false,返回true
#和false组成的Series类型
df.duplicated('key')#两行key这一列一样就算重复
df['A'].unique()# 返回唯一值的数组(类型为array)
df.drop_duplicates(['k1'])# 保留k1列中的唯一值的行,默认保留第一行
df.drop_duplicates(['k1','k2'], take_last=True)# 保留 k1和k2 组合的唯一值的行,take_last=True 保留最后一行
排序
索引排序
# 默认axis=0,按行索引对行进行排序;ascending=True,升序排序
df.sort_index()
# 按列名对列进行排序,ascending=False 降序
df.sort_index(axis=1, ascending=False)
值排序
# 按值对Series进行排序,使用order(),默认空值会置于尾部
s = pd.Series([4, 6, np.nan, 2, np.nan])
s.order()
df.sort_values(by=['a','b'])#按列进行排序
排名
a=Series([7,-5,7,4,2,0,4])
a.rank()#默认method='average',升序排名(ascending=True),按行(axis=0)
#average 值相等时,取排名的平均值
#min 值相等时,取排名最小值
#max 值相等时,取排名最大值
#first值相等时,按原始数据出现顺序排名
索引设置
reindex()
更新index或者columns,
默认:更新index,返回一个新的DataFrame
# 返回一个新的DataFrame,更新index,原来的index会被替代消失
# 如果dataframe中某个索引值不存在,会自动补上NaN
df2 = df1.reindex(['a','b','c','d','e'])
# fill_valuse为原先不存在的索引补上默认值,不在是NaN
df2 = df1.reindex(['a','b','c','d','e'], fill_value=0)
# inplace=Ture,在DataFrame上修改数据,而不是返回一个新的DataFrame
df1.reindex(['a','b','c','d','e'], inplace=Ture)
# reindex不仅可以修改 索引(行),也可以修改列
states = ["Texas","Utah","California"]
df2 = df1.reindex( columns=states )
set_index()
将DataFrame中的列columns设置成索引index
打造层次化索引的方法
# 将columns中的其中两列:race和sex的值设置索引,race为一级,sex为二级
# inplace=True 在原数据集上修改的
adult.set_index(['race','sex'], inplace = True)
# 默认情况下,设置成索引的列会从DataFrame中移除
# drop=False将其保留下来
adult.set_index(['race','sex'], inplace = True)
reset_index()
将使用set_index()打造的层次化逆向操作
既是取消层次化索引,将索引变回列,并补上最常规的数字索引
df.reset_index()
数据选取
[]
只能对行进 行(row/index) 切片,前闭后开df[0:3],df[:4],df[4:]
where 布尔查找
df[df["A"]>7]
isin
# 返回布尔值
s.isin([1,2,3])
df['A'].isin([1,2,3])
df.loc[df['A'].isin([5.8,5.1])]选取列A中值为5.8,5.1的所有行组成dataframe
query
多个where整合切片,&:于,|:或
df.query(" A>5.0 & (B>3.5 | C<1.0) ")
loc :根据名称Label切片
# df.loc[A,B] A是行范围,B是列范围
df.loc[1:4,['petal_length','petal_width']]
# 需求1:创建一个新的变量 test
# 如果sepal_length > 3 test = 1 否则 test = 0
df.loc[df['sepal_length'] > 6, 'test'] = 1
df.loc[df['sepal_length'] <=6, 'test'] = 0
# 需求2:创建一个新变量test2
# 1.petal_length>2 and petal_width>0.3 = 1
# 2.sepeal_length>6 and sepal_width>3 = 2 3.其他 = 0
df['test2'] = 0
df.loc[(df['petal_length']>2)&(df['petal_width']>0.3), 'test2'] = 1
df.loc[(df['sepal_length']>6)&(df['sepal_width']>3), 'test2'] = 2
iloc:切位置
df.iloc[1:4,:]
ix:混切
名称和位置混切,但效率低,少用
df1.ix[0:3,['sepal_length','petal_width']]
map与lambda
alist = [1,2,3,4]
map(lambda s : s+1, alist)#map就是将自定义函数应用于Series每个元素
df['sepal_length'].map(lambda s:s*2+1)[0:3]
apply和applymap
apply和applymap是对dataframe的操作,前者操作一行或者一列,后者操作每个元素
These are techniques to apply function to element, column or dataframe.
Map: It iterates over each element of a series.
df[‘column1'].map(lambda x: 10+x), this will add 10 to each element of column1.
df[‘column2'].map(lambda x: ‘AV'+x), this will concatenate “AV“ at the beginning of each element of column2 (column format is string).
Apply: As the name suggests, applies a function along any axis of the DataFrame.
df[[‘column1','column2']].apply(sum), it will returns the sum of all the values of column1 and column2.
df0[['data1']].apply(lambda s:s+1)
ApplyMap: 对dataframe的每一个元素施加一个函数
func = lambda x: x+2
df.applymap(func), dataframe每个元素加2 (所有列必须数字类型)
contains
# 使用DataFrame模糊筛选数据(类似SQL中的LIKE)
# 使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次
df_obj[df_obj['套餐'].str.contains(r'.*?语音CDMA.*')]
# 下面两句效果一致
df[df['商品名称'].str.contains("四件套")]
df[df['商品名称'].str.contains(r".*四件套.*")]
来源:https://blog.csdn.net/zhili8866/article/details/68134481


猜你喜欢
- 普通爬虫正常流程:数据来源分析发送请求获取数据解析数据保存数据环境介绍python 3.8pycharm 2021专业版【付费VIP完整版】
- 最近的项目涉及到很多表单的制作,特别是复选框(checkbox)和单选框(radio)。但是在前端开发过程中发现,单(复)选框和它们后面的提
- 一.Sobel算子Sobel算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘
- 微博如火如荼,大家都选择用微博带来社会化流量,顺便推广产品和网站,几乎所有的网站都有分享到代码,但是还有一种更快捷的分享方式,javascr
- MySQL中可以使用rename table这个SQL语句来修改表名。rename table这个SQL语句来修改表名的基本语法是:RENA
- 我想把存在数据库里的每天24小时来访者数另放到一个Excel文件中去,可以吗?可以,其实就是将数据库里面的内容生成一个Excel文件:toe
- driver.get("url")等到页面全部加载渲染完成后才会执行后续的脚本。在执行脚本时,driver.get(&q
- 废话不多说,直接上代码!@if ($user->id !== Auth::user()->id)<div id="
- 今天写一个脚本文件,需要将多个文件中的内容汇总到一个txt文件中,由于多个文件有三种不同的编码方式,读写出现错误,先将解决方法记录如下:#
- 1 conda介绍conda是一个python的包管理器,用来管理、安装、更新python的包和相关的依赖。另外,conda可以为特定任务创
- 1、什么是窗口函数?窗口函数也属于分析函数。Oracle从8.1.6开始提供窗口函数,窗口函数用于计算基于组的某种聚合值,窗口函数指定了分析
- 昨天在用用Pycharm读取一个200+M的CSV的过程中,竟然出现了Memory Error!简直让我怀疑自己买了个假电脑,毕竟是8G内存
- python中import和from import的区别首先明确尽量不要为了图省事使用from xxx import *python中有两种
- 之所以有这样一篇文章,是因为在前几天的一个晚上,要下班的时候,业务方忽然有一个需求,是需要恢复一个表里面的数据,当时问了下情况
- 新特性的产生背景在了解它怎么用之前,可以先了解一下它被推出的一些背景,可以帮助你对比开发体验上的异同点,以及了解为什么会有这一章节里面的新东
- # -*- coding:utf-8 -*-# python3.3.3import sys,time,re,urllib.par
- //继承function Person(name,sex){ this.name=name;
- 我们平时导入第三方模块的时候,一般使用的是 import 关键字,例如:import scrapyfrom scrapy.spider im
- 目录项目地址:简介使用主要代码项目地址:https://github.com/king-xw/Face_Recogntion简介本仓库是使用
- 本文实例讲述了Python设计模式之命令模式原理与用法。分享给大家供大家参考,具体如下:命令模式(Command Pattern):将请求封