数据集缺失值的处理

一. 数据集随机生成缺失值,并导出数据

def nan2(data, data1):
    '''
        随机生成缺失值的数据矩阵
        :param data: 完整数据集的数据矩阵
        :param data1: 空数据矩阵
        :return: 存在缺失值的数据矩阵
    '''
    for i in range(len(data.T)):
        num = data[:, i]
        num1 = rd.sample(range(0,len(num)), int((len(num) * 0.1)))    #10%的缺失值,保证不重复不为负值
        for j in range(len(num1)):
            num[num1[j]] = np.nan   #置空
        data1[:, i] = num
    return data1


def man():
    '''
        随机生成缺失值的数据集
        :return:
    '''
    filename = '../data/i.csv'
    filename1 = '../data/1.csv'
    Header = pd.DataFrame(pd.read_csv(filename, header=None))
    data = readcsv(filename)    #函数读取CSv数据集返回数据矩阵
    Header = np.array(Header)      #读取数据集的表头
    Header = Header[0]
    data1 = np.array(pd.DataFrame(pd.read_csv(filename)))
    data1 = nan2(data, data1)
    data1 = pd.DataFrame(data1)
    data1.to_csv(filename1, index=False, header=Header)     #数据矩阵输出为CSV文件

 运行结果:

     Sepal.Length  Sepal.Width  Petal.Length  Petal.Width           class
0             5.1          3.5           1.4          0.2     Iris-setosa
1             4.9          3.0           1.4          0.2     Iris-setosa
2             4.7          3.2           1.3          0.2     Iris-setosa
3             4.6          3.1           1.5          0.2     Iris-setosa
4             5.0          3.6           1.4          0.2     Iris-setosa
..            ...          ...           ...          ...             ...
145           6.7          3.0           5.2          2.3  Iris-virginica
146           6.3          2.5           5.0          1.9  Iris-virginica
147           6.5          3.0           5.2          2.0  Iris-virginica
148           6.2          3.4           5.4          2.3  Iris-virginica
149           5.9          3.0           5.1          1.8  Iris-virginica

     Sepal.Length  Sepal.Width  Petal.Length  Petal.Width           class
0             5.1          NaN           1.4          0.2     Iris-setosa
1             4.9          NaN           1.4          NaN     Iris-setosa
2             4.7          3.2           1.3          0.2     Iris-setosa
3             4.6          3.1           1.5          0.2     Iris-setosa
4             5.0          3.6           1.4          NaN     Iris-setosa
..            ...          ...           ...          ...             ...
145           6.7          3.0           5.2          2.3  Iris-virginica
146           6.3          2.5           5.0          1.9  Iris-virginica
147           6.5          3.0           5.2          2.0  Iris-virginica
148           NaN          NaN           5.4          2.3  Iris-virginica
149           5.9          3.0           5.1          1.8  Iris-virginica

二. 对含有缺失值的数据集进行补充

def nanm():
    '''
        均值补充缺失值
        :return:
    '''
    filename = '../data/3.csv'
    filename1 = '../data/1.csv'
    data = pd.DataFrame(pd.read_csv(filename1))
    Header = pd.DataFrame(pd.read_csv(filename1, header=None))
    Header = np.array(Header)
    Header = Header[0]
    print(data)
    for i in range(len(data.T) - 1):
        data[Header[i]] = data[Header[i]].fillna(round(data[Header[i]].mean(), 2))#均值填充
        # data[Header[i]] = data[Header[i]].fillna(round(data[Header[i]].median(), 2))#中位数填充
        # data[Header[i]] = data[Header[i]].fillna(round(stats.mode(Header[i][0][0]), 2))#众数填充
        # data[Header[i]] = data[Header[i]].fillna(method='pad')#用前一个数据进行填充
        # data[Header[i]] = data[Header[i]].fillna(method='bfill')#用后一个数据进行填充
    data.to_csv(filename, index=False)
    print(data)

 运行代码:

     Sepal.Length  Sepal.Width  Petal.Length  Petal.Width           class
0             5.1          NaN           1.4          0.2     Iris-setosa
1             4.9          NaN           1.4          NaN     Iris-setosa
2             4.7          3.2           1.3          0.2     Iris-setosa
3             4.6          3.1           1.5          0.2     Iris-setosa
4             5.0          3.6           1.4          NaN     Iris-setosa
..            ...          ...           ...          ...             ...
145           6.7          3.0           5.2          2.3  Iris-virginica
146           6.3          2.5           5.0          1.9  Iris-virginica
147           6.5          3.0           5.2          2.0  Iris-virginica
148           NaN          NaN           5.4          2.3  Iris-virginica
149           5.9          3.0           5.1          1.8  Iris-virginica

     Sepal.Length  Sepal.Width  Petal.Length  Petal.Width           class
0            5.10         3.06           1.4          0.2     Iris-setosa
1            4.90         3.06           1.4          1.2     Iris-setosa
2            4.70         3.20           1.3          0.2     Iris-setosa
3            4.60         3.10           1.5          0.2     Iris-setosa
4            5.00         3.60           1.4          1.2     Iris-setosa
..            ...          ...           ...          ...             ...
145          6.70         3.00           5.2          2.3  Iris-virginica
146          6.30         2.50           5.0          1.9  Iris-virginica
147          6.50         3.00           5.2          2.0  Iris-virginica
148          5.86         3.06           5.4          2.3  Iris-virginica
149          5.90         3.00           5.1          1.8  Iris-virginica

     Sepal.Length  Sepal.Width  Petal.Length  Petal.Width           class
0             5.1          3.0           1.4          0.2     Iris-setosa
1             4.9          3.0           1.4          1.4     Iris-setosa
2             4.7          3.2           1.3          0.2     Iris-setosa
3             4.6          3.1           1.5          0.2     Iris-setosa
4             5.0          3.6           1.4          1.4     Iris-setosa
..            ...          ...           ...          ...             ...
145           6.7          3.0           5.2          2.3  Iris-virginica
146           6.3          2.5           5.0          1.9  Iris-virginica
147           6.5          3.0           5.2          2.0  Iris-virginica
148           5.8          3.0           5.4          2.3  Iris-virginica
149           5.9          3.0           5.1          1.8  Iris-virginica

三. 代码整合

import pandas as pd
import numpy as np
import random as rd
from scipy import stats


def readcsv(filename):
    '''
        读取csv文件
        :param filename: csv数据集的相对地址
        :return: 数据矩阵
    '''
    df = pd.read_csv(filename)  # 读文件返回DataFrame对象
    df = pd.DataFrame(df).drop(labels=['class'], axis=1)
    data_arr = np.array(df)
    return data_arr


def nan2(data, data1):
    '''
        随机生成缺失值的数据矩阵
        :param data: 完整数据集的数据矩阵
        :param data1: 空数据矩阵
        :return: 存在缺失值的数据矩阵
    '''
    for i in range(len(data.T)):
        num = data[:, i]
        num1 = rd.sample(range(0, len(num)), int((len(num) * 0.1)))  # 10%的缺失值,保证不重复不为负值
        for j in range(len(num1)):
            num[num1[j]] = np.nan  # 置空
        data1[:, i] = num
    return data1


def man():
    '''
        随机生成缺失值的数据集
        :return:
    '''
    filename = '../data/i.csv'
    filename1 = '../data/1.csv'
    Header = pd.DataFrame(pd.read_csv(filename, header=None))
    data = readcsv(filename)
    Header = np.array(Header)  # 读取数据集的表头
    Header = Header[0]
    data1 = np.array(pd.DataFrame(pd.read_csv(filename)))
    # print(pd.DataFrame(pd.read_csv(filename)))
    data1 = nan2(data, data1)
    data1 = pd.DataFrame(data1)
    data1.to_csv(filename1, index=False, header=Header)  # 数据矩阵输出为CSV文件
    # data2 = pd.read_csv(filename1)
    # print(data2)


def nanm():
    '''
        均值补充缺失值
        :return:
    '''
    filename = '../data/3.csv'
    filename1 = '../data/1.csv'
    data = pd.DataFrame(pd.read_csv(filename1))
    Header = pd.DataFrame(pd.read_csv(filename1, header=None))
    Header = np.array(Header)
    Header = Header[0]
    # print(data)
    for i in range(len(data.T) - 1):
        data[Header[i]] = data[Header[i]].fillna(round(data[Header[i]].mean(), 2))  # 均值填充
        # data[Header[i]] = data[Header[i]].fillna(round(data[Header[i]].median(), 2))# 中位数填充
        # data[Header[i]] = data[Header[i]].fillna(round(stats.mode(Header[i][0][0]), 2))# 众数填充
        # data[Header[i]] = data[Header[i]].fillna(method='pad')# 用前一个数据进行填充
        # data[Header[i]] = data[Header[i]].fillna(method='bfill')# 用后一个数据进行填充
    data.to_csv(filename, index=False)
    # print(data)


def main():
    while (True):
        print(
            "实验五菜单(先运行1再运行2保证存在缺失值的数据集)\n" + "1.对Iris数据集随机生成10%的缺失值,并将数据导入到csv中\n" + "2.对含有缺失值的Iris数据集补充,其中的缺失值用这一维的均值补充\n" + "0.退出\n")
        num = int(input("输入菜单号:"))
        if num == 1:
            man()
            print("操作完成;请继续进行操作\n")
        elif num == 2:
            nanm()
            print("操作完成;请继续进行操作\n")
        else:
            print("退出系统\n")
            break


if __name__ == '__main__':
    main()

补充缺失值可参考:python实现缺失值处理_抓起的第一个娃娃的博客-CSDN博客_python缺失值处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ashpyxia

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

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

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

打赏作者

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

抵扣说明:

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

余额充值