读取 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 ()