目的:遍历文件夹,汇总csv文件导入新表,并进行基础数据清洗(去空去重去异常)。
1.1原始数据情况
数据集文件夹下含有1449个csv文件,1个《提交示例》csv文件
数据集文件夹下csv文件以1~1474顺序编辑,且缺失25个文件
《提交示例》文件含有:'商品id','未来一周天均销量字段',csv显示中文乱码,'商品id'和'未来一周天均销量'字段并未拆分
1.2数据处理步骤
1.2.1将《提交示例》修改为excel格式,便于观察具体内容;进行字段拆分(这里使用三种方法)
1.2.2文件夹内csv文件读取合并(这里也有两种方法)
1.2.3去重
1.2.4去空
1.2.5去dataframe两端空格
1.2.6去除异常值(商品id不超过done1列表区间,时间2021/7/8--2021/12/27区间)
1.2.1字段拆分
pandas库导入,《提交示例》文件读取(注意:# coding=gb2312这个编码超重要,凡是编码错误都可以试一下这个)
# coding=gb2312
import pandas as pd
df = pd.read_csv(r'H:\UserBehavior\test2\提交示例.csv','rb',encoding='utf-8',engine='python',error_bad_lines=False)
《提交示例》文件字段拆分,方法一:获取records,使用split拆分,存入新的dataframe,以xlsx格式保存。(数据量不大的话尽量存excel,使用的存储空间更小,约是csv文件的1/3,还不容易中文报错。csv老是乱码!)
data = []
for i in range(0,len(df)):
# print(df.iloc[i].str.split(',')[0][0])
id = df.iloc[i].str.split(',')[0][0]
sales = df.iloc[i].str.split(',')[0][1]
# print(id,'-------',sales)
i += 1
data.append([id,sales])
# print(data)
df2 = pd.DataFrame(data,columns=['商品id','未来一周日均销量'])
print(df2)
df2.to_excel(r'H:\UserBehavior\test2\done.xlsx',encoding='utf-8')
print('文件已保存成功')
《提交示例》文件字段拆分,方法二:使用map(lambda)定位records,使用split拆分。(复习下知识点:map和apply定位行或列,map只能传一个参数,apply可以传多个参数,applymap可以定位df的每个记录)
df = pd.read_csv(r'H:\UserBehavior\test2\提交示例.csv','rb',encoding='utf-8',engine='python',error_bad_lines=False,nrows=10)
df['商品id'] = df['商品id,未来一周天均销量'].map(lambda x : x.split(',')[0])
df['未来一周日均销量'] = df['商品id,未来一周天均销量'].map(lambda x : x.split(',')[1])
df2 = df.drop(labels='商品id,未来一周天均销量',axis=1)
print(df2)
df2.to_csv(r'H:\UserBehavior\test2\done1.csv',encoding='utf-8')
print('文件已保存成功')
《提交示例》文件字段拆分,方法三:使用字段直接定位该列,str.split分割,expand扩展,保存入新dataframe。
df = pd.read_csv(r'H:\UserBehavior\test2\提交示例.csv','rb',encoding='utf-8',engine='python',error_bad_lines=False)
# print(df)
new = df['商品id,未来一周天均销量'].str.split(',',expand=True)
new.columns=['商品id','未来一周日均销量']
# print(new)
new.to_excel(r'H:\UserBehavior\test2\done2.xlsx',encoding='utf-8')
print('文件已保存成功')
1.2.2文件读取合并
文件夹内csv文件读取合并(一般可以使用os库,使用os.listdir方法,但是for自遍历最高只有999次,这里文件数量超载了,所以这里不适用)先创建空表,遍历filename文件名,使用append拼接dataframe,输出保存即可。因为文件名和文件数量是不匹配的,所以使用try、except,记录没查到编号的文件名。
df_final = pd.DataFrame()
j = 0
for filename in range(1,1475):
filepath = r'H:\UserBehavior\test2\data_set' + '\\' + str(filename) + '.csv'
filename +=1
# print(filepath)
try:
df= pd.read_csv(filepath,header=0,encoding='utf-8',error_bad_lines=False)
df_final = df_final.append(df,ignore_index=True)
# print("-----已合并" + str(filename) + "文件数据-----")
except:
print("-----找不到编号为:" + str(filename-1) + "的文件数据-----")
j += 1
filename += 1
df_final.to_excel(r'H:\UserBehavior\test2\df_final.xlsx',encoding='utf-8')
print('文件已保存成功,合计丢失' + str(j) + '个文件')
1.2.3去重
去重(drop_duplicate去重,shape统计行数,相减)结果没重复值
df = pd.read_excel(r'H:\UserBehavior\test2\df_final.xlsx')
df_distinct = df.drop_duplicates(subset=None, keep='first', inplace=False)
print('已删除重复数,合计:' + str(list(df.shape)[0]-list(df_distinct.shape)[0]) + '行')
1.2.4去空
去空(这里有三个方法哈,查空值,也是没空值就没下一步了)删除的话df.dropna()就行了
print(df[df.isnull().T.any()]) #筛选所有有空值的行
# print(df.count()) #统计各列非空行数
# print(pd.isnull(df).sum()) #判断各record是否为空,用sum汇总计数
1.2.5去两端空格
去dataframe两端空格,applymap定位,strip删除两端空格(因为后续商品id需要和《提交示例》的商品id做对比,所以两个表都需要去除多余空格) done.xlsx 、done1.xlsx 都是 提交示例.csv 文件,使用了不同方法做的
df = df.applymap(lambda x: str(x).strip())
df2 = pd.read_excel(r'H:\UserBehavior\test2\done.xlsx')
df2 = df2.applymap(lambda x: str(x).strip())
print('已去除多余空格')
df.to_excel(r'H:\UserBehavior\test2\df_final.xlsx',encoding='utf-8')
df2.to_excel(r'H:\UserBehavior\test2\done.xlsx',encoding='utf-8')
print('文件已更新保存')
1.2.6去异常
去除异常值(商品id不超过done1列表区间,时间2021/7/8--2021/12/27区间)
商品id:因为商品id重复很多回,需要unique一下
df = pd.read_excel(r'H:\UserBehavior\test2\df_final.xlsx')
df2 = pd.read_excel(r'H:\UserBehavior\test2\done.xlsx')
list_1 = list(df['商品id'].unique())
list_2 = list(df2['商品id'].unique())
list_temp = []
for i in list_1:
if i not in list_2:
print('异常商品id:' + str(i))
list_temp.append(i)
# print(list_temp)
print('-----异常商品id已检查完毕-----合计:' + str(len(list_temp)) + '条异常值')
商品id:这里我又写了两个方法(用不等于就好了)print(df3[15916:16089])是为了检查异常值删掉了没有
for j in list_temp:
index = df[df['商品id']==j].index
print(index)
df3 = df.drop(labels=list(index),axis=0)
# print(df3)
print('-----已完成异常商品id清理工作-----')
print(df3[15916:16089])
'''
for j in list_temp:
df4 = df[df['商品id']!=j]
# print(df4[15916:16089])
'''
日期:pd.to_datetime转成时间格式,df['日期'].dt.date转成日期,这里时间无意义
df = pd.read_excel(r'H:\UserBehavior\test2\df_final.xlsx')
# print(df.head(10))
df['日期'] = pd.to_datetime(df['时间'])
df['日期'] = df['日期'].dt.date
df = df.drop('时间',axis=1)
# print(df.head(10))
df.to_excel(r'H:\UserBehavior\test2\df_final.xlsx',encoding='utf-8')
print('数据预处理完毕')