中关村手机资料之数据清洗---2(深入了解str.extract()和str.contains()方法)

import pandas as pd
import numpy as np

#--标注列名
data=pd.read_csv(r'phones.csv',engine='python')
col=['index','name','cpu','battary','screen','frequency','camera','memory','storage','time','price']
data.columns=col
data.head()  

#--删除不需要的列
df=data.drop(['index','storage'],axis=1) ##---删除列 ,默认删除行
# df = data.set_index('index')
# df.shape

#--删除已知的无效数值
df = df.drop(df[df.battary == '无'].index)  #-------删除battary为无的行,必须加.index
df = df.drop(df[df.cpu == '无'].index)    
df = df[df.price.str.contains('\d+')]   #提str.contains()返回bool值,df[bool值]等价于df.loc[bool,:]
def get_price(x):
    if '万'in x:
        return float(x[:-1])*10000
    else:
        return int(x)
    
df['price']=df['price'].apply(get_price)
df = df.dropna() #------这一步其实可有可无,
# df.shape

#--CPU分类,不需要再用apply()方法,apply(pd.Series)返回的是DataFrame的格式
df.cpu[df.cpu.str.contains('高通|三星|苹果')] = 1
df.cpu[~(df.cpu == 1)] = 0 #---上一个'高通|苹果|三星'已经被赋值覆盖,索引查找不到只能用判断语句,否则报错
# df.shape

#--电池分类
df1 = df.battary.str.split('mAh').apply(pd.Series)
df1.columns = ['battary1','battary2']

df1.battary2[df1.battary2.str.contains('不可拆卸')] = 1 #---再次标注,contains()返回的是bool值,跟进numpy的矩阵原理进行计算.
df1.battary2[~(df1.battary2 == 1)] = 0
# df1.head()

df['battary1'] = df1['battary1']
df['battary2'] = df1['battary2']

df=df.drop(['battary'],axis=1) #--删除多余的列

#--屏幕尺寸去除单位
df['screen']=df.screen.str.extract('(\d.\d+)英寸')#---只返回第一个匹配'()'号中正则表达式的是数据
# df.head()

#--CPU频率分类
df['kernel']=df.frequency.str.extract('\s(\w+)核$') #--提取核数

df=df.drop(['frequency'],axis=1)#--删除多余的列

kernel_dict=dict(zip(['八', '四', '十', '双', '单', '六', '两', '二','双四','真八'],[8,4,10,2,1,6,2,2,8,8])) #
# print(kernel_dict)
df['kernel']=df['kernel'].map(kernel_dict) #--map()方法与dict()工厂函数均是映射类型,具有哈希特性(唯一性)

#--RAM容量分类并去掉单位
df['memory'] = df.memory.str.extract('(\w+)GB$')
# df.head()

#--后置摄像头,分类与连续变量
df['camera_pix'] = df['camera'] #--生成新的列

df.camera[df.camera.str.contains('双|[+]|副')] = 1  #--符合双摄的为1
df.camera[~(df.camera == 1)] = 0

df['two_camera'] = df['camera']
df['camera_pix'] = df.camera_pix.str.extract('(\d+)万')

df=df.drop(['camera'],axis=1) #--删除多余的列
# df.head()

#--获取时间差
df['time'] =pd.to_datetime(df['time']) #--类型转换

df['delta-T'] = pd.datetime.now()-df['time']
from datetime import  datetime as dt
df['delta-T'] = df['delta-T'].dt.days #--以天为间隔

df.to_csv(r'C:\Users\ANT\Desktop\中关村手机筛选后数据2.csv',encoding = 'gbk')#--保存数据
df.dropna()
df

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值