Python数据清洗之利用pandas筛选数据详解
作者:sodaloveer
利用pandas筛选数据
在Pandas中,最常用的数据结构是Series和DataFrame。
Series是一维的数组-like对象,用于存储任意类型的数据。
DataFrame是二维的表格型数据结构,可以存储多种类型的数据,并且可以进行灵活的数据操作和分析。
直接筛选
比较运算符(==、<、>、>=、<=、!=)逻辑运算符 &(与)、|(或)、~(非),使用比较运算符时,请将每个条件括在括号内。
运算符的优先级是NOT(〜),AND(&),OR(|)。
读取数据
import os import pandas as pd import numpy as np #读取文件 def read_file(filepath): os.chdir(os.path.dirname(filepath)) return pd.read_csv(os.path.basename(filepath),encoding='utf-8') file_pos="C:\\Users\\周晓婷\\Desktop\\train_data_original.csv" data_pos=read_file(file_pos)
查看数据类型
data_pos.dtypes
筛选出frand_flag为0的数据
data_pos[data_pos['frand_flag']==0] ##用比较运算符‘=='直接筛选
筛选出frand_flag不为1的数据
data_pos[data_pos['frand_flag']!=1] data_pos[~(data_pos['frand_flag']==1)]
筛选cdr_duration>=15的数据
data_pos[data_pos['cdr_duration']>=15] ##用比较运算符“>=”直接筛选
筛选cdr_duration<15的数据
data_pos[data_pos['cdr_duration']<15]
筛选cdr_duration<=15且frand_flag=0的数据
data_pos[(data_pos['cdr_duration']<=15)&(data_pos['frand_flag']==0)]
筛选cdr_duration<=15或cdr_duration>60的数据
data_pos[(data_pos['cdr_duration']<=15)|(data_pos['cdr_duration']>60)]
函数筛选
比较函数(eq, ne, le, lt, ge, gt)
筛选出frand_flag为0的数据
data_pos[data_pos['frand_flag'].eq(0)]
筛选出frand_flag不为1的数据
data_pos[data_pos['frand_flag'].ne(1)]
筛选cdr_duration>=15的数据
data_pos[data_pos['cdr_duration'].ge(15)]
筛选cdr_duration<=15的数据
data_pos[data_pos['cdr_duration'].le(15)]
筛选cdr_duration<=15且frand_flag=0的数据
data_pos[(data_pos['cdr_duration'].le(15))&(data_pos['frand_flag'].eq(0))]
范围运算 between(left,right)
筛选cdr_duration>=15或cdr_duration<=60的数据
data_pos[data_pos['cdr_duration'].between(15,60)]
筛选start_date>=20220701且start_date<=20221031的数据
data_pos[data_pos['start_date'].between(20220701,20221031)]
字符筛选 Series.str.contains(pattern或字符串,na=False)
测试pattern或regex是否包含在Series或Index的字符串中。
Series列要为字符数据类型。
最终返回:布尔值的系列或索引。
布尔值的Series或Index,指示给定模式是否包含在Series或Index的每个元素的字符串中。
函数语法:
Series.str.contains(pat,case = True,flags = 0,na = nan,regex = True)
参数说明如下:
参数 | 描述 |
pat | str类型。字符序列或正则表达式。 |
case | bool,默认为True。如果为True,区分大小写。 |
flags | int,默认为0(无标志)。标志传递到re模块,例如re.IGNORECASE。 |
na | 默认NaN,填写缺失值的值。 |
regex | bool,默认为True。如果为True,则假定pat是正则表达式。如果为False,则将pat视为文字字符串。所以针对特殊符号,默认情况下我们必须使用转义符,或者设置 regex=False。 |
筛选billing_nbr为移动号码,移动号码用正则表达式
#该列转换为字符数据类型(2种方法) data_pos['billing_nbr']=data_pos['billing_nbr'].apply(str) data_pos['billing_nbr']=data_pos['billing_nbr'].values.astype('str') data_pos=data_pos[data_pos['billing_nbr'].str.contains('^1[35678]\d{9}$')] print(data_pos.shape)
模糊查询,筛选某列中包含某个字符,比如“筛选start_date为202207的数据”
data_pos['start_date']=data_pos['start_date'].apply(str) data_pos=data_pos[data_pos['start_date'].str.contains('202207')] print(data_pos.shape)
筛选channel_type_desc为实体渠道的数据,na=False的意思就是,遇到非字符串的情况,直接忽略。你也可以写na=True,意思就是遇到非字符串的情况,计为筛选有效。如果遇到非字符串没有标明na参数会报错。
data_pos_1=data_pos_1[data_pos_1['channel_type_desc'].str.contains('实体渠道',na=False)]
apply()函数
筛选出frand_flag为0的数据
data_pos[data_pos['frand_flag'].apply(lambda x:x==0)]
截取billing_nbr前7位数
data_pos['billing_nbr']=data_pos['billing_nbr'].apply(str) data_pos['billing_nbr_pre7']=data_pos['billing_nbr'].apply(lambda x:x[0:8]) data_pos['billing_nbr_pre7']=data_pos['billing_nbr'].map(lambda x:x[0:8])
筛选billing_nbr为移动号码,移动号码用正则表达式
import re def func(x): if re.search('^1[35678]\d{9}$',x): return(True) else: return(False) data_pos[data_pos['billing_nbr'].apply(func)]
筛选某一列并替换其他字符:筛选channel_type_desc列,将”含有实体渠道的“全部替换”实体渠道”,将“含有电子渠道的”全部替换成“电子渠道”,将“含有直销渠道的”全部替换成“直销渠道”,其他替换为未知。
未修改前,数据详情:
import re def func(data): if re.match(r'[\u4e00-\u9fa5]*实体渠道*[\u4e00-\u9fa5]',str(data)): return "实体渠道" elif re.match(r'[\u4e00-\u9fa5]*电子渠道*[\u4e00-\u9fa5]',str(data)): return "电子渠道" elif re.match(r'[\u4e00-\u9fa5]*直销渠道*[\u4e00-\u9fa5]',str(data)): return "直销渠道" else: return "未识别" data_pos_1['channel_type_desc_1']=data_pos_1.channel_type_desc.apply(func)
import re def func(x): if re.search(r'[\u4e00-\u9fa5]*实体渠道*[\u4e00-\u9fa5]',str(x)): return "实体渠道" elif re.search(r'[\u4e00-\u9fa5]*电子渠道*[\u4e00-\u9fa5]',str(x)): return "电子渠道" elif re.search(r'[\u4e00-\u9fa5]*直销渠道*[\u4e00-\u9fa5]',str(x)): return "直销渠道" else: return "未识别" data_pos_1['channel_type_desc_1']=data_pos_1.channel_type_desc.apply(func)
数据替代后,数据详情:
isin()函数,支持多值筛选,用列表表示
筛选出frand_flag为0的数据
data_pos[data_pos['frand_flag'].isin([0])]
筛选出called_nbr包含10086、10010、10016、114的数据
data_pos[data_pos['called_nbr'].isin([10086,10010,10016,114])]
~isin()
筛选called_nbr不包含10086、10010、10016、114的数据
data_pos[~data_pos['called_nbr'].isin([10086,10010,10016,114])]
到此这篇关于Python数据清洗之利用pandas筛选数据详解的文章就介绍到这了,更多相关pandas筛选数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!