开启生长之旅!这是我参加「日新方案 2 月更文挑战」的第 12 天,点击检查活动详情

前言

众所周知咱们获取的第一手数据往往都是比较乱七八糟的,这些文件保存一般都是csv文件或者是excel文件,读取转化成DataFrame还有或许因为缺少列索引或者是各类数据维度不相等而报错。读取成功为DataFrame依然有许多问题存在,比方列索引缺失,众多NaN数据以及兼并计算问题等,这篇文章将具体处理此场景下的内容。

一、索引缺失

读取缺失量较大的数据时,索引并不是能完全覆盖到的。存在着列索引缺失的问题,这是一个比较头疼的问题,使得咱们后面的数据特征无法运用:

数据分析之Pandas处理DataFrame稀疏数据及维度不匹配数据详解

这是针对机器学习的数据集特征,面临这种状况咱们能够经过从头设置索引的方式,假使特征之间是有规则的话,例如上表5列以后的数据每列的列索引都是features的话那么咱们能够经过reindex的方法给它补全索引:

def deal_defect(df,n):
    df_defect=df.iloc[:,n:]
    m=4
    list_columns=[]
    for i in range(df_defect.shape[1]):
        list_columns.append('features%d'%m)
        m=m+1
    df_defect.columns=list_columns
    df_all=pd.concat([df.iloc[:,:n],df_defect],axis=1)
    return df_all
deal_defect(df,5)

数据分析之Pandas处理DataFrame稀疏数据及维度不匹配数据详解

二、负值取正

若是要对整个DataFrame的值都取负数,并不需求挨个列都转再运用abs函数,读取的DataFrame一般都是object类型不能直接运用abs,需求运用astype将dataframe类型转化:

当数据中带有NaN时是不能直接转int的:

df_fill=df.astype('int')
IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integer

但是咱们转化为float的时候原始数据集又出现了后面带.0的状况:

数据分析之Pandas处理DataFrame稀疏数据及维度不匹配数据详解

这儿咱们要运用到fillna函数,先转为float取绝对值之后再填充为空值之后替换为-1,这样一来-1的方位便是缺失值的方位,以便于咱们辨认:

def fill_conver(df):
    df_fill=df.astype('float')
    df_fill=abs(df_fill)
    df_fill=df_fill.fillna('')
    df_fill=df_fill.replace('',-1)
    df_fill=df_fill.astype(int)
    return df_fill
fill_conver(df)

数据分析之Pandas处理DataFrame稀疏数据及维度不匹配数据详解

三.提取数值

既然有许多空值咱们能够采取侧缺将低于必定份额的数据去除,这部分在上篇缺失值处理文章现已谈到这儿不再阐明。咱们最常遇到的状况便是需求处理空值只提去出相应标签下的数值,这儿涉及到列索引的挑选和兼并操作。例如咱们只需求特征列偶数列的数值:

def get_features(df):
    list_all_link=[]
    df=df.iloc[:,2:]
    for i in range(df.shape[0]):
        #flag为操控外层循环开关
        flag=1
        for j in range(df.shape[1]):
            if(flag==0):
                break
            if(j%2==0):
                if(df.iloc[i:i+1,j].item()==-1):
                    flag=0
                else:
                    list_all_link.append(list(df.iloc[i:i+1,j]))
    return list_all_link
get_features(df)

数据分析之Pandas处理DataFrame稀疏数据及维度不匹配数据详解

四、提取仅有值

假如咱们需求只需求取到的数列中的仅有值,需求对数据集进行处理,能够运用ravel()和unique()函数。此刻咱们还需求注意删掉-1:

def unique_df(df):
    df_features=df.iloc[:,2:]
    unique_series=pd.Series(pd.Series(df_features.iloc[:,[i%2==0 for i in range(len(df_features.columns))]].values.ravel()).unique())
    list_series=list(unique_series.values)
    return list_series
unique_list=unique_df(df)
unique_list.remove(-1)
unique_list

点关注,防走丢,如有疏忽之处,请留言指教,非常感谢

以上便是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,咱们下期见。