数据预处理(文件夹遍历+去空去重去异常)

目的:遍历文件夹,汇总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('数据预处理完毕')

结束,整体还是比较简单粗糙的,非专业跨行学习,轻喷。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值