Pandas实战练习02_20200914

读取 guazi.csv 二手车数据

• 1.重命名列名(可以修改为中文(专业英语))
• 2.异常值处理
• 3.去除重复值
• 4.年份,里程,售价,原价所在列的数据进行转换(数值型数据)
• 5.缺失值的处理
• 6.保存数据

代码实现

#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time           : 2020/9/14 15:48
#@Author         : GodSpeed
#@File           : Pandas实战02_02.py
#@Software       : PyCharm

import pandas as pd

import numpy as np


'''
读取 guazi.csv  二手车数据
• 1.重命名列名(可以修改为中文(专业英语))
• 2.异常值处理
• 3.去除重复值
• 4.年份,里程,售价,原价所在列的数据进行转换(数值型数据)
• 5.缺失值的处理

'''

# 定义数据规范
dict_data={
    
    
    "year":"年",
    "mileage":"万公里",
    "sales_price":"万",
    "original_price":"万"
}

#保留数字和小数点
def keep_value(data):
    '''
    :param data: 待处理的数据
    :return: 返回数据中包含数字和.的内容
    '''
    return "".join(list(filter(lambda x: x in "0123456789.", data)))

#格式化数据,保留数字和,
def data_format_fun(df,dict_data):
    df_new = df
    for key,values in dict_data.items():
        df_new[key] = df[key].apply(keep_value)
    return df_new

#处理异常值
def deal_exception_value(df,dict_data):
    for key,values in dict_data.items():
        print(key)
        print(df[key])
        df_new = df[(df[key]==df[key])&(df[key].str.contains(values))]
    return df_new



#判断是否存在缺失值
def Judging_NaN_fun(df):
    '''
    :param df: 被判断的对象,类型为DataFrame
    :return: True表示存在,False表示不存在
    '''
    # 判断数据是否存在nan
    if df.isnull().values.any():
        print('存在nan数据')
        #打印nan所在的行
        #print(northward_data[northward_data.isnull().values == True])
        return True
    else:
        print('不存在nan数据')
        return False

#判断是否存在重复值
def Judging_duplicate(df):
    '''

    :param df: 被判断的对象,类型为DataFrame
    :return: True表示存在,False表示不存在
    '''
    # 判断数据是否存在nan
    if df.duplicated().values.any():
        print('存在重复数据')
        return True
    else:
        print('不存在重复数据')
        return False


#处理瓜子数据主函数
def deal_guazi():
    # 读取 guazi.csv  二手车数据
    guazi_data = pd.read_csv('./瓜子/guazi.csv')

    #print(guazi_data.head())
    '''
                       leixing  nianfen  licheng  didian  shoujia  yuanjia
    0  凯迪拉克ATS-L 2016款 28T 时尚型    2016年   2.5万公里      长沙   16.77万   34.60万
    1     奥迪A6L 2014款 TFSI 标准型    2014年  13.8万公里      长沙   21.96万   44.50万
    2   本田 思域 2016款 1.8L 自动舒适版    2016年   4.8万公里      长沙    8.87万   15.20万
    3   大众 朗逸 2015款 1.6L 自动舒适版    2016年  10.5万公里      长沙    7.27万   14.90万
    4                  leixing  nianfen  licheng  didian  shoujia  yuanjia
    '''
    #print(guazi_data.info())
    '''
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 2010 entries, 0 to 2009
    Data columns (total 6 columns):
     #   Column   Non-Null Count  Dtype 
    ---  ------   --------------  ----- 
     0   leixing  2010 non-null   object
     1   nianfen  2010 non-null   object
     2   licheng  2010 non-null   object
     3   didian   2010 non-null   object
     4   shoujia  2010 non-null   object
     5   yuanjia  1937 non-null   object
    dtypes: object(6)
    memory usage: 47.2+ KB
    None
    '''
    #print(guazi_data.columns.values)
    #['leixing' 'nianfen' 'licheng' 'didian' 'shoujia' 'yuanjia']

    #1.重命名列名(可以修改为中文(专业英语))
    guazi_data.rename({
    
    "leixing": "brand", "nianfen": "year","licheng": "mileage","didian": "place","shoujia": "sales_price","yuanjia": "original_price"}, axis=1,inplace=True)

    #print(guazi_data.columns.values)
    #['brand' 'year' 'mileage' 'place' 'sales_price' 'original_price']

    #2.异常值处理
    # year不包括"年",mileage不包括"万公里",sales_price不包括"万",original_price不包括"万"

    guazi_data = deal_exception_value(guazi_data,dict_data)
    #print(guazi_data)

    #3.去除重复值
    #print(guazi_data.shape)
    if Judging_duplicate(guazi_data):
        print('存在重复值')
        # 删除重复数据
        guazi_data.drop_duplicates(inplace=True)
    else:
        print('不存在重复值')

    #print(guazi_data.shape)

    #4.年份,里程,售价,原价所在列的数据进行转换(数值型数据)
    # 年份,里程,售价,原价的非数字和.的字符
    # 利用函数映射来实现
    guazi_data = data_format_fun(guazi_data,dict_data)

    #转换类型为数值
    print('3333333333',guazi_data[["mileage","sales_price","original_price"]])
    #guazi_data.loc[:,("mileage","sales_price","original_price")].astype("float") #神奇索引

    # 采用函数映射修改数据类型为数值
    '''
    #将参数转换为数字类型。
    pandas.to_numeric(arg, errors='raise', downcast=None)
    arg : scalar(标量),list(列表),

    (tuple)元组,一维数组(1-d array)或Series
    
    errors  : {'ignore','raise','coerce'},
    
    默认为'raise'
    如果为‘raise’,则无效的解析将引发异常
    如果为 ‘coerce’,则将无效解析设置为NaN
    如果为 ‘ignore’,则无效的解析将返回输入
    downcast : {'integer','signed','unsigned','float'},
    默认为None
    如果不是None(无),并且数据已成功转换为数字dtype

    默认返回dtype为float64或int64, 具体取决于提供的数据。使用downcast参数获取其他dtype。
    请注意,如果传入非常大的数字,则可能会导致精度损失。由于ndarray的内部限制,如果数字
    小于-9223372036854775808(np.iinfo(np.int64).min)或大于18446744073709551615(np.iinfo(np.uint64).max)传入,
    很有可能会将它们转换为float以便将其存储在ndarray中。
    这些警告类似地适用于 Series,因为它在内部利用ndarray。
    '''
    guazi_data[["mileage","sales_price","original_price"]] = guazi_data[["mileage","sales_price","original_price"]].apply ( pd.to_numeric, errors='ignore' )

    print(guazi_data)
    print ( guazi_data.info() )
    print ( guazi_data.shape )#(1927, 6)

    #5.缺失值的处理
    if Judging_NaN_fun(guazi_data):
        print('存在NAN值')
        # 删除重复数据
        guazi_data.s.dropna(inplace=True) #删除包含NaN的行
    else:
        print('不存在NAN值') #NaN已经在数据格式化环节处理

    # 保存数据
    guazi_data.to_csv('瓜子资料整合结果.csv',encoding="utf-8-sig")
if __name__ == '__main__':
    deal_guazi ()


结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Narutolxy/article/details/108580644