datawhale组队学习——pandas基础下——缺失数据

学习资源链接:pandas缺失数据

一、总览

datawhale组队学习——pandas基础下——缺失数据_第1张图片

二、疑问

1.NaT是对时序版本的缺失值
2.datawhale组队学习——pandas基础下——缺失数据_第2张图片
3.datawhale组队学习——pandas基础下——缺失数据_第3张图片

datawhale组队学习——pandas基础下——缺失数据_第4张图片datawhale组队学习——pandas基础下——缺失数据_第5张图片

三、思考题

【问题一】 如何删除缺失值占比超过25%的列?

这个倒是不知道

【问题二】 什么是Nullable类型?请谈谈为什么要引入这个设计?

这是Pandas在1.0新版本中引入的重大改变,其目的就是为了(在若干版本后)解决之前出现的混乱局面,统一缺失值处理方法

【问题三】 对于一份有缺失值的数据,可以采取哪些策略或方法深化对它的了解?

四、练习题

【练习一】现有一份虚拟数据集,列类型分别为string/浮点/整型,请解决如下问题:¶
(a)请以列类型读入数据,并选出C为缺失值的行。
(b)现需要将A中的部分单元转为缺失值,单元格中的最小转换概率为25%,且概率大小与所在行B列单元的值成正比。
【练习二】 现有一份缺失的数据集,记录了36个人来自的地区、身高、体重、年龄和工资,请解决如下问题:
(a)统计各列缺失的比例并选出在后三列中至少有两个非缺失值的行。
(b)请结合身高列和地区列中的数据,对体重进行合理插值。

五、程序代码以及相关注释

学习部分

import pandas as pd
import numpy as np
df = pd.read_csv('F:/program study/python/joyful-pandas-master/data/table_missing.csv')
df.head(10)
#复习一下读入操作

pd.Series([1,np.nan,3],dtype='bool')

s = pd.Series([True,False],dtype='bool')
s[1]=np.nan
s
#在所有的表格读取后,无论列是存放什么类型的数据,默认的缺失值全为np.nan类型
#因此整型列转为浮点;而字符由于无法转化为浮点,因此只能归并为object类型('O'),原来是浮点型的则类型不变
#None在传入数值类型后,会自动变为np.nan 只有当传入object类型是保持不动,几乎可以认为,除非人工命名None,它基本不会自动出现在Pandas中

s_original = pd.Series([1, 0], dtype="bool") #此处重新加一句是因为前面赋值改变了bool类型
s_original[0] = None
s_original
#不懂这里的运行结果
#此外,和object类型的一点重要区别就在于,在调用字符方法后,string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变


df['Physics'].head()

df['Physics'].fillna('missing').head()

#线性插值
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s

s.interpolate()
s.interpolate().plot()

作业练习部分

df2 = pd.read_csv('F:/program study/python/joyful-pandas-master/data/Missing_data_one.csv')
df2.head(10)

df2.convert_dtypes().dtypes
#这里指转换类型,是把原来的int转换成Int,object转换成string,bool转换成boolean
#原文中提到的
#    它的好处就在于,其中前面提到的三种缺失值都会被替换为统一的NA符号,且不改变数据类型
#    就像原文中写的那样,当赋值为na类型之后,原本的int变成了float,但是现在的nullable中的Int类型不会变成float,还会是Int类型

df2[df2['C'].isna()]
#请以列类型读入数据,并选出C为缺失值的行。

df2 = pd.read_csv('F:/program study/python/joyful-pandas-master/data/Missing_data_one.csv').convert_dtypes()
total_b = df2['B'].sum()
min_b = df2['B'].min()
df2['A'] = pd.Series(list(zip(df2['A'].values
                    ,df2['B'].values))).apply(lambda x:x[0] if np.random.rand()>0.25*x[1]/min_b else np.nan)
df2.head()

#这里的x[0]表示取第一维,lamba函数是一个没有名称的函数,一个临时的函数
#if语句的用法
#if 判断条件:
#    执行语句……
#else:
#   执行语句……

# x if condition else y 是一个 python 的专门的语法,等价于 C 里面的 condition ? x : y,
#如果你没学过 C 的话,这个语法的含义就是,先判断 condition 的真假,如果为真,整个表达式就返回 x,如果为假就返回 y。

df.isna().sum()/df.shape[0]
df_not2na = df[df.iloc[:,-3:].isna().sum(1)<=1]
df_not2na.head()
#标准答案所给的写法
#要返回各缺失值的比例,首先我们得用到isna().sum(),然后除以总行数,所以要用到之前学习的shape
#这里是统计各列缺失的比例并选出在后三列中至少有两个非缺失值的行。

#自己想的写法
df_not2na = df[df.loc[-3:].isna().sum(1)<=1]
df_not2na.head()
#自己根据前面所学的知识所给的写法,换用loc来进行

df_not2na = df[df.loc[:,['体重','年龄','工资']].isna().sum(1)<=1]
df_not2na.head()
#换用loc的另一种方法来进行

#请结合身高列和地区列中的数据,对体重进行合理插值。
#参考答案写法
df_method_1 = df.copy()
for name,group in df_method_1.groupby('地区'):
    df_method_1.loc[group.index,'体重'] = group[['身高','体重']].sort_values(by='身高').interpolate()['体重']
df_method_1['体重'] = df_method_1['体重'].round(decimals=2)
#df_method_1.head()
df_method_1.plot()

df_method_2 = df.copy()
df_method_2.interpolate(method='index').plot()
#自己写的按索引进行线性插值

datawhale组队学习——pandas基础下——缺失数据_第6张图片
datawhale组队学习——pandas基础下——缺失数据_第7张图片

你可能感兴趣的:(Python,pandas)