.val()数据乱码_Python数据清洗

本文介绍了在Python数据清洗过程中遇到的.val()数据乱码问题,并提供了解决方案。内容包括根据条件定位字段赋值、数据集合并、数据重塑、异常值检测与过滤、字符串和正则表达式操作、处理缺失数据、数据转换、重命名、排序、时间格式转换等关键步骤,旨在帮助读者有效处理和修复数据清洗中的乱码问题。
摘要由CSDN通过智能技术生成

根据条件定位某个字段并赋值

data.loc[(data.Cabin.notnull()),'Cabin'] = 1 #将Cabin属性不为空的Cabin列赋值为1
Mean_age_Mr = data[data.Name.str.contains('Mr')]['Age'].mean() #求名字中有Mr的人的年龄的平均数
data.loc[(data['Name'].str.contains('Dr'))&data.Age.isnull(),'Age')] =Mr_age_Mr #对名字里包含Dr且年龄为空的进行赋值

合并数据集

Df1 = DataFrame({‘key’:[‘b’,’b’,’a’,’c’,’a’,’a’,’b’],’data1’:range(7)})
Df1 = DataFrame({‘key:[‘a’,’b’,’d’],’data2’:range(3)})
Pd.merge(df1,df2,on=’key’)
Pd.merge(df1,df2,left_on=’key’,right_on=’rkey’)
Pd.merge(df1,df2,left_on=’key’,right_on=’key’,how=’outer’)

重塑层次化索引

stack()
unstack()
移除重复数据
Data = DataFrame({‘k1’:[‘one’]*3+[‘two’]*4,’k2’:[1,1,2,3,3,4,4]})
Data.dupllicated()   #返回一个布尔型的Series,表示各行是否为重复行
Data.drop_duplicates()  #默认判断全部列
data[‘v1’] = range(7)
data.drop_duplicates([‘k1’])

利用函数或者映射实现数据转换

.eg
Meat_to_animal = {‘bacon’:’pig’,’pulled pork’:’pig’,’pastrami’:’cow’,’honey ham’:’pig’,’nova lox’:’salmon’}
由于涉及到大小写,所以此处统一转换为小写
Data[‘animal’] = data[‘food’].map(str.lower).map(meat_to_animal)
Data[‘food’].map(lambda x:meat_to_animal[x.lower()])  #等价于上面

替换值

Data.replace(-999,np.nan)
Data.replace([-999,-1000],np.nan)
Data.replace([-999,-1000],[np.nan,0])
Data.replace({-999:np.nan,-1000:0})

重命名

Data.rename(index={‘OHIO’:’INDIANA’},columns = {‘three’:’peekaboo’})

离散化和面元划分

Ages = [20,22,25,27,21,23,37,31,61,45,41,32]
Bins = [18,25,35,60,100]
Cats = pd.cut(ages,bins)
group_names = [‘Youth’,’Young Adult’,’MiddleAged’,’Senior’]
pd.cut(ages,bins,labels=group_names)

检测和过滤异常值

data.loc[(data.a>2.5)|(data.a<-2.5)] = 2.5  #某列大于或者小于2.5的值赋值为2.5

字符串操作

Val = ‘ a, b, guido’
Val.split(‘,’)
Pieces = [x.strip() for x in val.split(‘,’)]
Val.index(‘,’)
Val.find(‘:’)
Val.count(‘,’)

正则表达式

import re
text = “foo bart baz tqux”
re.split(‘s+’,text)
re.split(‘s+’,text)
regex = re.compile(‘s+)
regex.findall(text)   #findall返回的是字符串中所有的匹配项
#search 只返回第一个
#match 
#分解邮箱帐号
text = “”” Dava dave@google.com Steve steve@gmail.com”””
pattern = r’[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}’
regex = re.compile(pttern,flags= re.IGNORECASE) #IGNORECASE 表示对大小写不敏感	

使用findall得到所有符合条件的结果

regex.findall(text)

将匹配到的模式替换为指定的模式

regex.sub(‘REDACTED’,text)

想要把匹配到的内容分为3部分,只需要将待分段的模式的各部分用圆括号包起来即可

pattern= r’([A-Z0-9._%+-]+)@([A-Z0-9.-]+).([A-Z]{2,4})’
regex = re.compile(pattern,flags = re.IGNORECASE)
#对于带有分组功能的模式,findall会返回一个元组列表
regex.findall(text)		

处理缺失数据

test1.dropna()   #删除为空的数据
test1.dropna(how=’all’)  #删除全为空的行
test1.dropna(axis=1,how=’all’) #删除全为空的列
test1.fillna(0) #只要列为空,则删除整行
test1.fillna({1:0.5,2:0})
test.fillna(df.iloc[1].mean())  #将平均值填入空值

数据转换

移除重复数据
data.drop_duplicates()   #默认判断全部列
data.drop_duplicates([‘k1’])   #制定某一个列
data.drop_duplicates([‘k1],keep=’last’)   #默认保存第一个出现的值组合,加入keep则保存最后一个

利用函数或者映射进行时 数据转换

data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon',
                             'Pastrami', 'corned beef', 'Bacon',
                             'pastrami', 'honey ham', 'nova lox'],
                   'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
 meat_to_animal = {
  'bacon': 'pig',
  'pulled pork': 'pig',
  'pastrami': 'cow',
  'corned beef': 'cow',
  'honey ham': 'pig',
  'nova lox': 'salmon'}
lowercased = data['food'].str.lower()
data['animal'] = lowercased.map(meat_to_animal)
data['food'].map(lambda x: meat_to_animal[x.lower()])  #也可用一个函数来实现

重命名列

data = data.rename(columns={'列1':'seq','备注':'remark','名称':'name','布局':'layout','大小':'area','朝向':'direction',
                    '补充':'extra','是否有交通线路':'traffic','价格':'price','最后更新时间':'last_update'}, ,inplace = True)

排序

frame = DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
frame.sort_index(by='b')
frame.sort_index(by='b',ascending=False) #按照降序排序

corrDf['Survived'].sort_values(ascending = False)

删除数据后重塑索引位置

data = data.reset_index(drop = True)

实现count(distinct *)

data.groupby('国家')['小计','顾客号码'].agg({'小计':np.sum,'顾客号码':pd.Series.nunique})

解决图表的乱码问题

from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

禁用分组键作为索引

data_RFM = data_RFM.groupby("顾客号码",as_index=False).agg({'发票号码':pd.Series.nunique,'年月日':np.max,'小计':np.sum})

时间格式转为字符串

1eb24e8b9d1900d04e266bd634bd4773.png

将字符串类型转换为时间类型

#字符串转时间格式
#时间格式的数据相减,取间隔天数
from datetime import datetime
value = '2011-01-03'
datetime.strptime(value,'%Y-%m-%d')

获取时间间隔

value = '2011-01-03'
value = datetime.strptime(value,'%Y-%m-%d')
result = datetime.now() - value
result.days

转成月份

113458e488dacdd579bfad046cccfbe9.png

当前日期前后几天几小时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值