numpy作业04_20200826

作业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')

处理结果:
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Narutolxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值