Datawhale学习记录7

本文介绍了如何在Pandas中处理缺失值,包括使用isna/isnull统计缺失信息,利用dropna删除缺失值,使用fillna进行填充以及interpolate插值方法。还探讨了Nullable类型及其在数据计算和分组中的处理,最后提供两个关于缺失值处理的练习题。
摘要由CSDN通过智能技术生成

缺失值的统计和删除

缺失信息的统计

缺失数据可以使用isna或isnull来查看每个单元格是否缺失,sum可以算出缺失的数量。

如果想要查看某一列缺失或者非缺失的行,可以利用Series上的isna或者notna进行布尔索引。如果想要同时对几个列,检索出全部为缺失或者至少有一个缺失或者没有缺失的行,可以使用isna, notna和any, all的组合。

缺失信息的删除

数据处理中经常需要根据缺失值的大小、比例或其他特征来进行行样本或列特征的删除,pandas中提供了dropna函数来进行操作。

dropna的主要参数为轴方向axis(默认为0,即删除行)、删除方式how、删除的非缺失值个数阈值thresh( 非缺失值 没有达到这个数量的相应维度会被删除)、备选的删除子集subset,其中how主要有any和all两种参数可以选择。
不使用dropna也可以进行相同操作

缺失值的填充和插值

利用fillna进行填充

在fillna中有三个参数是常用的:value, method, limit。其中,value为填充值,可以是标量,也可以是索引到元素的字典映射;method为填充方法,有用前面的元素填充ffill和用后面的元素填充bfill两种类型,limit参数表示连续缺失值的最大填充次数。

插值函数

对于interpolate而言,除了插值方法(默认为linear线性插值)之外,有与fillna类似的两个常用参数,一个是控制方向的limit_direction,另一个是控制最大连续缺失值插值个数的limit。其中,限制插值的方向默认为forward,这与fillna的method中的ffill是类似的,若想要后向限制插值或者双向限制插值可以指定为backward或both

Nullable类型

缺失记号及其缺陷

在python中的缺失值用None表示,该元素除了等于自己本身之外,与其他任何元素不相等。
在numpy中利用np.nan来表示缺失值,该元素除了不和其他任何元素相等之外,和自身的比较结果也返回False。值得注意的是,虽然在对缺失序列或表格的元素进行比较操作的时候,np.nan的对应位置会返回False,但是在使用equals函数进行两张表或两个序列的相同性检验时,会自动跳过两侧表都是缺失值的位置,直接返回True。

Nullable类型的性质

在进入1.0.0版本后,pandas尝试设计了一种新的缺失类型pd.NA以及三种Nullable序列类型来应对这些缺陷,它们分别是Int, boolean和string。从字面意义上看Nullable就是可空的,言下之意就是序列类型不受缺失值的影响。

一般在实际数据处理时,可以在数据集读入后,先通过convert_dtypes转为Nullable类型。

缺失数据的计算和分组

当调用函数sum, prob使用加法和乘法的时候,缺失数据等价于被分别视作0和1,即不改变原来的计算结果。当使用累计函数时,会自动跳过缺失值所处的位置。

练习

EX1:缺失值与类别的相关性检验

// An highlighted block
import numpy as np
import pandas as pd
df = pd.read_csv('../data/missing_chi.csv')
cat_1 = df.X_1.fillna('NaN').mask(df.X_1.notna()).fillna("NotNaN")
cat_2 = df.X_2.fillna('NaN').mask(df.X_2.notna()).fillna("NotNaN")
df_1 = pd.crosstab(cat_1, df.y, margins=True)
df_2 = pd.crosstab(cat_2, df.y, margins=True)
def compute_S(my_df):
    S = []
    for i in range(2):
        for j in range(2):
            E = my_df.iat[i, j]
            F = my_df.iat[i, 2]*my_df.iat[2, j]/my_df.iat[2,2]
            S.append((E-F)**2/F)
    return sum(S)
res1 = compute_S(df_1)
res2 = compute_S(df_2)
from scipy.stats import chi2
chi2.sf(res1, 1) # X_1检验的p值 # 不能认为相关,剔除

chi2.sf(res2, 1) # X_2检验的p值 # 认为相关,保留

from scipy.stats import chi2_contingency
chi2_contingency(pd.crosstab(cat_1, df.y), correction=False)[1]
chi2_contingency(pd.crosstab(cat_2, df.y), correction=False)[1]

EX2:用回归模型解决分类问题

// An highlighted block
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsRegressor
df = pd.read_excel('../data/color.xlsx')
df_dummies = pd.get_dummies(df.Color)
stack_list = []
for col in df_dummies.columns:
    clf = KNeighborsRegressor(n_neighbors=6)
    clf.fit(df.iloc[:,:2], df_dummies[col])
    res = clf.predict([[0.8, -0.2]]).reshape(-1,1)
    stack_list.append(res)
code_res = pd.Series(np.hstack(stack_list).argmax(1))
df_dummies.columns[code_res[0]]

from sklearn.neighbors import KNeighborsRegressor
df = pd.read_csv('../data/audit.csv')
res_df = df.copy()
df = pd.concat([pd.get_dummies(df[['Marital', 'Gender']]), df[['Age','Income','Hours']].apply(lambda x:(x-x.min())/(x.max()-x.min())), df.Employment],1)
X_train = df.query('Employment.notna()')
X_test = df.query('Employment.isna()')
df_dummies = pd.get_dummies(X_train.Employment)
stack_list = []
for col in df_dummies.columns:
    clf = KNeighborsRegressor(n_neighbors=6)
    clf.fit(X_train.iloc[:,:-1], df_dummies[col])
    res = clf.predict(X_test.iloc[:,:-1]).reshape(-1,1)
    stack_list.append(res)
code_res = pd.Series(np.hstack(stack_list).argmax(1))
cat_res = code_res.replace(dict(zip(list(range(df_dummies.shape[0])),df_dummies.columns)))
res_df.loc[res_df.Employment.isna(), 'Employment'] = cat_res.values
res_df.isna().sum()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值