python清洗Excel数据常用方法

|▌冷眼眸甩不掉的悲伤 提交于 2020-04-08 11:57:25

有没有小伙伴和我一样,日常工作就是处理大量表格?是不是觉得脑累肩累心累?十年前有个人也跟我们一样为繁琐的工作感到沮丧,然后他就去学习了python,然后构建了专门用来处理表格的pandas项目。他就是pandas的作者Wes McKinney。pandas处理表格真是太好用了,博主写了这个程序以后,原来每个月都要没日没夜赶好多天的工作,现在只要拿着茶杯等着程序运行。
下面我们来看看一些常见的数据处理方法吧。

import pandas as pd
import numpy as np
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os

#处理日期
def quzheng_states(x):
    if x>datetime.today():
        return '未取证'
    elif x<=datetime.today():
        return '已取证'

#数据分箱
def area_distribution(x):
    if x<=90:
        return '90方以内'
    elif x<=120:
        return '90-120方'

#时间差,即过去到现在过了多长时间
def stock_age(x):
    try:
        y=relativedelta(datetime.today(),x)
        return y.months
    except:
        return 0

#把日期格式转化成“年月”格式
def year_month(x):
    try:
        y=pd.to_datetime(x).strftime('%Y-%m')
        return y
    except:
        pass

#数据清洗与处理
def frame_create(path):
    frame=pd.read_excel(path,usecols=['项目','楼栋','产品类型','房源名称','预售许可证取证日期','推盘日期','预测建筑面积','成交总价',
                            '成交总价建面单价','付款方式名称','按揭贷款','认购日期','签约日期',skipfooter=1)

        #分列
    frame['住宅类型']=[x.split('-')[0] for x in frame.产品类型.dropna()]
    frame.产品类型=[x.split('-')[1] for x in frame.产品类型.dropna()]

        #字段名重命名
    frame.rename(columns={'产品类型':'业态'},inplace=True)

    frame['库龄(月)']=frame.推盘日期.apply(stock_age)
    frame['预售证状态']=frame.预售许可证取证日期.apply(quzheng_states)
    frame['面积段分布']=frame.预测建筑面积.apply(area_distribution)
    frame['签约年月']=frame.签约日期.apply(year_month)

    #获得动态货值
    products=frame.业态.unique()
    dict={}
    for product in products:
            factor1=frame.业态==product
            factor2=frame.成交总价!=0
            price=float(frame[factor1&factor2].成交总价建面单价.mean())
            dict[product]=price

    def f(x):
        y=dict[x]
        return y

    frame['动态货值']=np.where(frame.成交总价==0,frame.预测建筑面积*frame.业态.apply(f),frame.成交总价)

    return frame

#获取每个文件的路径
path_list=[]
for root,dirs,files in os.walk(r'/Users/fangluping/Desktop/2019年12月'):
    for file in files:
        path_name=os.path.join(root,file)
        path_list.append(path_name)

#每个清洗过的底表横向合并
df=pd.DataFrame()
for path in path_list[1:]:
    frame=frame_create(path)
    df=pd.concat([df,frame])

#业态数据清洗
df.loc[df.业态.str.contains('高层'),'业态']='高层'

df.to_csv(r'/Users/fangluping/Desktop/python/现金流套表/数据底表总表.csv',index=None,encoding='utf_8_sig')
#以上生成数据底表

python清洗Excel数据常用方法

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!