作业01
在 files 文件夹下有多个文件,需要通过代码获取文件名称列表并且将文件数据进行 行堆叠 ,并保存到新的文件中。
文件内容:
五粮液.csv
云南白药.csv
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/8/268:45
#@Author : GodSpeed
#@File : 20200825课程代码.py
#@Software : PyCharm
import numpy as np
import os
#把rootDir路径下的所有文件的绝对路径保存在列表中
def get_file_list(rootDir:str)->list:
'''
:param rootDir: 文件根目录
:return: 返回文件列表
'''
print(rootDir)
file_list=[]
try:
file_list = os.listdir(rootDir)
except FileNotFoundError:
print(f'系统找不到指定的路径{rootDir}')
return
np_list = np.array(file_list,dtype=str)
np_rootDir = np.array(rootDir,dtype=str)
# 把文件名和文件夹路径合并为文件绝对路径保存在列表中
file_list = np.core.defchararray.add(np_rootDir,np_list).tolist()
return file_list
# 水平合并csv_files_list中的文件内容
def vstack_data(csv_files_list:list,new_file_name:str):
'''
:param csv_files_list: csv文件列表
:type csv_files_list: list
:param new_file_name: 合并后的文件名
:type new_file_name: str
:return: 成功返回0,其他失败
:rtype: int
'''
if csv_files_list:
print(csv_files_list)
else:
print ( 'vstack_data err: csv_files_list is null return!' )
return -1
vstack_li = []
# 遍历取出每个 文件名
i_start_row = -1 # 读取的起始行
for file_name in csv_files_list:
# 读取每个文件的 数据
print('file_name=',file_name)
i_start_row = 0 if file_name == csv_files_list[0] else 1
try:
per_data = np.loadtxt(file_name, skiprows=i_start_row, delimiter=",", dtype="object")
except OSError:
print(f'没有找到文件或读取文件失败,请查看是否存在{file_name}文件')
return -1
# 将这些数据 都放到 列表 或者 元组当中
vstack_li.append(per_data)
print(len(vstack_li))
# 数据行堆叠
v_data = np.vstack(vstack_li)
# 保存文件
np.savetxt(new_file_name, v_data, delimiter=",", fmt="%s")
return 0
if __name__ == '__main__':
#rootDir = r'D:\Python_study\PyWorkSpace\venv\数据分析\jupyter\20200825\files' + '\\'
rootDir = r'D:\Python_study\myPyQt\jupyter\20200825\files' + '\\'
file_list = get_file_list(rootDir)#传递数据文件夹路径,返回此文件夹下的文件绝对路径列表
#print('file_list=',file_list)
new_file_name = '合并数据.csv'
if file_list:
print ( 'vstack_data success !' ) if 0 == vstack_data(file_list,new_file_name) else print('vstack_data err!')
else:
print('get_file_list err!')
水平合并的结果:
附加补充练习
用列均值来代替nan
测试源数据文件内容如下图:
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/8/279:22
#@Author : GodSpeed
#@File : 拓展练习博客版本20200825.py
#@Software : PyCharm
import numpy as np
import pandas as pd
#Mean processing Nan
#方法1:用np实现1
def nan_to_mean_cls_pro(csv_file_name:str,csv_Newfile_name:str):
'''
:param csv_file_name: 待处理数据的csv文件
:type csv_file_name: str
:param csv_Newfile_name: 处理完成后数据保存的csv文件
:type csv_Newfile_name: str
:return: 0表示成功 -1表示失败
:rtype:int
'''
#1.np读取文件数据(因为存在空元素,而Np要求元素必须统一类型,所以就指定字符串
try:
data = np.loadtxt(csv_file_name, delimiter=",", dtype=object)
except OSError:
print('OSError: exam.csv not found')
return -1
head_str = ",".join(data[0,:].tolist())# 把第一行ndarray转换为列表再转换为字符串
#print(head_str)
#exam_data = np.loadtxt(csv_file_name,skiprows=1,delimiter=",",dtype=object)
#取除第二行开始的所有数据
print(data)
row = data.shape[0] - 1
exam_data = data[range(1,row+1),:]
print(exam_data)
#1.判断数据中是否存在nan的数据
if len(exam_data["" == exam_data]) == 0:
#不存在需要处理的数据,直接把数据进行转存
np.savetxt(csv_Newfile_name, exam_data, delimiter=",", fmt="%s", header=head_str)
return 0
else:
print('源文件存在需要处理的数据,继续进行后续处理')
#2.将空元素替换为"nan"
exam_data["" == exam_data] = "nan"
#print(exam_data)
#3.改变数据类型为"float"
#exam_data = exam_data.astype(float)
exam_data = exam_data.astype("float64")
#print(exam_data)
#print(exam_data.dtype)
#4.把等于nan的数据用当前列的均值替换
for i in range(exam_data.shape[1]):
#exam_data[exam_data != exam_data]
#非nan数据的均值
c_data = exam_data[:,i]
#把nan元素替换为非nan元素的列均值
c_data[c_data!=c_data] = c_data[c_data==c_data].mean().round()
print(exam_data)
#5.保存处理后的数据文件
np.savetxt(csv_Newfile_name,exam_data,delimiter=",",fmt="%s",header=head_str)
return 0
#方法2:用np实现2
def nl_to_mean_my_pro(csv_file_name:str,csv_Newfile_name:str):
'''
:param csv_file_name: 待处理数据的csv文件
:type csv_file_name: str
:param csv_Newfile_name: 处理完成后数据保存的csv文件
:type csv_Newfile_name: str
:return: 0表示成功 -1表示失败
:rtype:int
'''
#1.np读取文件数据(因为存在空元素,而Np要求元素必须统一类型,所以就指定字符串
try:
data = np.loadtxt(csv_file_name, delimiter=",", dtype=object)
except OSError:
print('OSError: exam.csv not found')
return -1
head_str = ",".join(data[0,:].tolist())# 把第一行ndarray转换为列表再转换为字符串
#print(head_str)
#exam_data = np.loadtxt(csv_file_name,skiprows=1,delimiter=",",dtype=object)
#取除第二行开始的所有数据
print(data)
row = data.shape[0] - 1
exam_data = data[range(1,row+1),:]
print(exam_data)
#1.判断数据中是否存在nan的数据
if len(exam_data["" == exam_data]) == 0:
#不存在需要处理的数据,直接把数据进行转存
np.savetxt(csv_Newfile_name, exam_data, delimiter=",", fmt="%s", header=head_str)
return 0
else:
print('nl_to_mean_my_pro源文件存在需要处理的数据,继续进行后续处理')
#2.把等于""的数据用当前列的均值替换
for i in range(exam_data.shape[1]):
#非nan数据的均值
c_data = exam_data[:,i]
#把nan元素替换为非nan元素的列均值
c_data["" == c_data] = str(c_data["" != c_data].astype("float64").mean().round())
print(exam_data)
#3.保存处理后的数据文件
np.savetxt(csv_Newfile_name,exam_data,delimiter=",",fmt="%s",header=head_str)
return 0
# 方法3:利用pd来处理均值替换nan
def nan_to_mean_pd_pro(csv_file_name: str, csv_Newfile_name: str):
'''
:param csv_file_name: 源文件名
:param csv_Newfile_name: 处理后的文件名
:return: 0表示成功,其他表示失败
'''
try:
#1. pd读取文件
pd_context = pd.read_csv(csv_file_name)
except FileNotFoundError:
print(f'不存在{csv_file_name},请核实')
return -1
#读取csv文件
else:
#文件存在正常处理
print(type(pd_context))
print(pd_context)
print('{}'.format(6 * '='))
#print(pd_context.isnull().values.any())
# 2 判断文件中是否存在nan
if pd_context.isnull().values.any():
print('文件存在nan需要处理,自动进行后续处理')
else:
# 文件不存在nan数据,直接保存到新文件
pd_context.to_csv(csv_Newfile_name, index=False)
return 0
#3. 按列均值替换nan
New_pd_context = pd_context.fillna(pd_context.mean(axis=0).round())
#4.保存处理后的数据
New_pd_context.to_csv(csv_Newfile_name, index=False)
return 0
if __name__ == '__main__':
if nan_to_mean_cls_pro("exam.csv","nan_new_exam.csv") !=0:
print('nan_to_mean_cls_pro err')
else:
print('nan_to_mean_cls_pro success')
if nl_to_mean_my_pro("exam.csv","nl_new_exam.csv") !=0:
print('nl_to_mean_my_pro err')
else:
print('nl_to_mean_my_pro success')
if nan_to_mean_pd_pro("exam.csv","pd_exam.csv") !=0:
print('nan_to_mean_pd_pro err')
else:
print('nan_to_mean_pd_pro success')
处理结果: