python 将数据集划分为完整数据集和缺失数据集

首先需要用的python包:

import pandas as pd

然后,正式开始处理数据。
1.定义一个数组

dataset=[[1,2,3,4,5],[1,2,3,None,5],[1,None,3,4,5],[1,2,3,4,5]]

2.将list类型转为pandas的DataFrame类型

df=pd.DataFrame(dataset)
print(df)

在这里插入图片描述
3.找到具有缺失值的数据

dataset_missing=df[df.isnull().values==True]
print(dataset_missing)

在这里插入图片描述
今天做实验发现,这个方法有问题,当一行具有多个缺失值时,会返回多个行的数据,因此决定用一个笨办法:

def find_complete_rows(df):
    """
    找到DataFrame的完整数据行
    :param df:
    :return:
    """
    missing_matrix = df.isnull()
    print(missing_matrix)
    complete_rows = []
    for i in range(missing_matrix.shape[0]):
        flag = True
        for j in range(missing_matrix.shape[1]):
            if missing_matrix.iloc[i, j]:
                flag = False
                break
        if flag:
            complete_rows.append(i)

    return complete_rows

有点笨但是简单啊,不想思考了-0-

4.如果需要找到具有缺失值的列,需要做两步操作

#1判断哪些列存在缺失值(返回的是Series类型的数据)
coloums_missing_status=df.isnull().any()

在这里插入图片描述

#2找到缺失列的列,用to_list()方法返回list
coloums_missing=coloums_missing_status.index[coloums_missing_status==True].to_list()

在这里插入图片描述
5.找到没有缺失值的数据,也需要两步

#1根据前面找到的缺失数据,获得缺失值的列名(返回的list)
missing_index=dataset_missing.index.to_list()
print(missing_index)

在这里插入图片描述

#2在原始数据中去除有缺失值的行
dataset_complete=df.loc[~df.index.isin(missing_index)]
print(dataset_complete)

在这里插入图片描述
最后附上所有代码

import pandas as pd

"""
input: Full dataset
output: Missing dataset and Complete dataset
"""
def split_dataset(dataset):
    #将list类型转为pandas的DataFrame类型
    df=pd.DataFrame(dataset)
    print(df)
    #找到具有缺失值的数据
    dataset_missing=df[df.isnull().values==True]
    print(dataset_missing)
    
    #如果需要找到具有缺失值的列,需要做两步操作
    #1判断哪些列存在缺失值(返回的是Series类型的数据)
    colums_missing_status=df.isnull().any()
    print(colums_missing_status)
    #2找到缺失列的列,用to_list()方法返回list
    colums_missing=colums_missing_status.index[colums_missing_status==True].to_list()
    print(colums_missing)
    coloums_missing=coloums_missing_status.index[coloums_missing_status==True].to_list()
    print(coloums_missing)
    
    #找到没有缺失值的数据,也需要两步
    #1根据前面找到的缺失数据,获得缺失值的列名(返回的list)
    missing_index=dataset_missing.index.to_list()
    print(missing_index)
    #2在原始数据中去除有缺失值的行
    dataset_complete=df.loc[~df.index.isin(missing_index)]
    print(dataset_complete)

    return dataset_missing,dataset_complete

if __name__=='__main__':
    #定义一个数组
    dataset=[[1,2,3,4,5],[1,2,3,None,5],[1,None,3,4,5],[1,2,3,4,5]]
    dataset_missing,dataset_complete=split_dataset(dataset)

=======================================
今天突然发现,如果在一行数据中存在多个缺失值,就不能用上面的步骤获得缺失数据了,因为会重复。那么,如果一行数据中存在多个缺失值,获得缺失数据的方法如下:
Pandas居然有自带的去Nan方法

//使用pandas自带的dropna()方法:
#删除表中某行全部为NaN的行 
nonan_df = df.dropna(axis=0, how='all') 
#删除表中某行含有任何NaN的行
nonan_df = df.dropna(axis=0, how='any')
#删除表中有NaN的任意行
nonan_df = df.dropna(axis=0)
“”“
补充:
删除行的参数axis = 0
删除列的参数axis = 1
”“”

当一行数据有多个缺失值时,查看有nan的行

#1 查看含有nan的行
dataset_missing=df[df.isna().any(axis=1)]
#2 查看不含nan的行
dataset_complete=df[~df.isna().any(axis=1)]

新的代码如下

def split_dataset(dataset):
    #将list类型转为pandas的DataFrame类型
    df=pd.DataFrame(dataset)
    print('------初始数据-------')
    print(df)
    #找到具有缺失值的数据,需要两步
    #1 查看含有nan的行
    dataset_missing=df[df.isna().any(axis=1)]
    #2 查看不含nan的行
    dataset_complete=df[~df.isna().any(axis=1)]
    
    #判断各列的缺失情况
    colums_missing_status=dataset_missing.isna().any()#判断的数据小一些
    colums_missing=colums_missing_status[colums_missing_status==True].index.to_list()
    print('------有nan的缺失数据-----------')
    print(dataset_missing)
    print('------无nan的完整数据-----------')
    print(dataset_complete)
    print('------有nan的列-----------')
    print(colums_missing)

if __name__=='__main__':
    #定义一个数组
    dataset=[[1,2,3,4,5],[1,None,None,None,5],[1,None,3,4,5],[1,2,3,4,5]]
    split_dataset(dataset)

运行结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值