Py学习  »  Python

Python : 商铺数据清洗及存储

一个普普通通简简单单平平凡凡的神 • 5 年前 • 544 次点击  

项目主要技能

  • 数据拆分 .split('')
  • 将不完整的数据设定为缺失数据,并将其移除
  • 将完整数据清洗成列表字典(json模式)

完成心得

经过一段时间的基础练习后,这是第一个接手完成的Python项目,毕竟是自学的关系所以容易陷入窘境。然而花了很多时间在复习网易课程视频、自己的笔记、以及在JupyterNotebook练习敲的代码中去研究Python逻辑,完成这次项目后很有成就感。继续努力。


项目题目

1、成功读取“商铺数据.csv”文件

2、解析数据,存成列表字典格式:[{'var1':value1,'var2':value2,'var3':values,...},...,{}]

3、数据清洗:

① comment,price两个字段清洗成数字

② 清除字段缺失的数据

③ commentlist拆分成三个字段,并且清洗成数字

4、结果存为.pkl文件

# 成功读取“商铺数据.csv”文件
path = '/Users/alice/Desktop/商铺数据.csv'
f=open(path,'r',encoding='UTF-8')
for i in f.readlines()[:10]:  #给定范围(几笔数据)
    print(i.split(',')[2])  #只print(i)太乱,按照逗号做split
在商铺数据中读取给定范围的数据,这里是只读取索引2位置(点评数量)的数据

#数据清洗:① comment,price两个字段将有完整数据的各'关键点'找出来并清洗成数字,没有关键点的一律成为缺失数据

f.seek(0)
def fcm(s):
    if '条' in s:    #comment:没有‘条’即表示缺失数据
        return(int(s.split('               ')[0]))   #以提行拆分后选择索引[0],最后进行数字整型化int()
    else:
        return('缺失数据')

for i in f.readlines()[:10]:
    comm_count = fcm(i.split(',')[2])   #以逗号拆分并提出索引2位置的值为评论数的参数
    print(comm_count)
Comment: 将有关键字‘条’的数据,其索引0位置的值设定为数字(原来为字符串),其余设定为缺失数据
def fpr(s):
    if '¥' in s:      #price:没有‘¥’即表示缺失数据
        return(int(s.split('¥')[-1]))   #以‘¥’作为拆分,并提取索引[-1]的值做数字整型化
    else:
        return('缺失数据')

for i in f.readlines()[:10]:   #给定范围比较不会太多数据影响效率
    price = fpr(i.split(',')[4]) #以逗号拆分数据并且提出索引4位置的值为price的参数
    print(price)
Price: 将有关键字‘¥’的数据,其索引-1位置的值设定为数字(原来为字符串),其余设定为缺失数据

#数据清洗:③ commentlist拆分成三个字段,并且清洗成数字

for i in f.readlines()[40:50]:  #给定范围(几笔数据)
    print(i.split(',')[-1].split('                                '))   
#以逗号拆分后取最后一个值,并且再以提行拆分成三个字段。
由列表得知,长度没有等于3的即表示缺失数据
def fcl(s):   
    if len(s) == 3:
        quality = float(s[0][2])  #第0个索引(质量)然后提取索引2位置(数字)为质量的值
        environment = float(s[1][2])
        service = float(s[2][2])
        return([quality,environment,service])
    else:
        return('缺失数据')
    
for i in f.readlines()[40:50]:
    commentlist = fcl(i.split(',')[-1].split('                             '))
    print(commentlist)
三个字段各自提取数字部分并且数字浮点hua化,其余长度不为3的即为缺失数据

#数据清洗:② 清除字段缺失的数据:只将完整数据纳入新列表

f.seek(0)   #将光标返回到开头,才能成功读取。
n=0
m=[]

for i in f.readlines()[1:]:    #第一列(索引0)为标头,所以要从索引1开始读
    data = (i.split(','))
    #print(data)    #data就是全部的数据
    classi = data[0]
    name = data[1]
    comm_count = fcm(data[2])  #按照上面的自定义函数表示
    star = data[3]
    price = fpr(data[4])
    add = data[5]
    quali = fcl(data[-1].split('                                '))[0]    #直接从上面复制粘贴,将 (i.split(','))改成data。
    envir = fcl(data[-1].split('                                '))[1]    #在最后表示每一个字段的索引位置
    servi = fcl(data[-1].split('                                '))[2]
    
    if '缺失数据' not in [comm_count,price,quali,envir,servi]:
        n+=1
        datalst = [[ 'Classify', classi ], [ 'Restaurant', name ], [ '评论数量', comm_count ], [ '星级', star ], [ 'Price', price ], [ 'Address', add ], [ 'Quality', quali ], [ 'Environment', envir ], [ 'Service', servi ]]
        #print(datalst) # 为复合列表,可进行转化成字典格式
        #print(dict(datalst))
        m.append(dict(datalst))  # 解析数据,存成列表字典格式:[{'var1':value1,'var2':value2,'var3':values,...},...,{}]    
        
print(m[50:55])
print('------------------------')
print('成功读取共%i笔完整数据' %n)            #将readlines()[]范围去掉,才可完整读取。
print('------------------------')
f.close()
print('finished!')   
将复合列表转化成字典模式后,再做成列表字典(json模式)

# 结果存为.pkl文件: pickle.dump()

import pickle
pic_file = open('/Users/alice/Desktop/商铺数据完整版.pkl','wb')
pickle.dump(m, pic_file)   #m就是上面的列表字典内容
pic_file.close()
print('finished!')

finished!

# 读取.pkl文件: pickle.load()

在之后的Python中都可以任意import pickle并读取此次.pkl文件的内容

import pickle
file2 = open('/Users/alice/Desktop/商铺数据完整版.pkl','rb')
datalst = pickle.load(file2)
print(datalst[:10])
通过open语句将文件路径放入pickle.load()的函数里,即可print出内容。

项目完成


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/BPqR8imc2F
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13393
 
544 次点击