P6

题题题…

1.问题

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

import numpy as np
import pandas as pd
from numpy import nan as NaN

df = pd.read_csv(r'C:\\Users\YANG\Desktop\joyful-pandas-master\data\table_missing.csv')
index_counts = df.shape[0]  # 取出第一维的大小,即每列含有元素的总个数
print(index_counts)  # 35
nan_series = (df.isna().sum() / index_counts > 0.25)  # 计算每列缺失值是否大于25%,以Series形式返回布尔值
print(nan_series)
nan_list = nan_series[nan_series].index.tolist()  # 将 缺失值大于25%的列,列名存放到列表中
print(nan_list)  # ['Weight']
new_df = df.drop(columns=nan_list, axis=1)  # 使用drop函数删除这些列,并返回一个新的工作表
print(new_df.head()) 
'''
  School Class      ID Gender   Address  Height  Math Physics
0    S_1   C_1     NaN      M  street_1     173  34.0      A+
1    S_1   C_1     NaN      F  street_2     192  32.5      B+
2    S_1   C_1  1103.0      M  street_2     186  87.2      B+
3    S_1   NaN     NaN      F  street_2     167  80.4     NaN
4    S_1   C_1  1105.0    NaN  street_4     159  84.8      A-
'''

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

Nullable 数据类型常用于pandas处理丢失的数据,若要生成这种数据类型,需要在生成array() 或者 Series时,在dtype变量中直接指定。它的好处就在于,可将这三种缺失值(np.nan,None,NaT)都会被替换为统一的NA符号,且不改变数据类型。

如果数据类型恰好是标识符,这就有效地消除了数据类型的转换可能会带来隐患。

“The goal of pd.NA is provide a “missing” indicator that can be used consistently across data types (instead of np.nan, None or pd.NaT depending on the data type).”——User Guide for Pandas v-1.0

官方也是这么鼓励用户使用新的数据类型和缺失类型pd.NA

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

首先,可以先观察缺失值的分布与类型
其次,对缺失值进行统计,运算与分组
再者,可采取不同的填充方式填充缺失值或根据不同的要求剔除行列等
最高,根据 interpolate 函数限制参数,对数据进行有趣的操作

2.练习

【练习一】现有一份虚拟数据集,列类型分别为string/浮点/整型,请解决如下问题:

import numpy as np
import pandas as pd
from numpy import nan as NaN

df = pd.read_csv(r'C:\\Users\YANG\Desktop\joyful-pandas-master\data\/Missing_data_one.csv')
print(df.head())
'''
         A      B     C
0  not_NaN  0.922   4.0
1  not_NaN  0.700   NaN
2  not_NaN  0.503   8.0
3  not_NaN  0.938   4.0
4  not_NaN  0.952  10.0
'''

(a)请以列类型读入数据,并选出C为缺失值的行。

(以列类型读入数据是什么玩意儿???)

C为缺失值的行如下:

df = pd.read_csv(r'C:\\Users\YANG\Desktop\joyful-pandas-master\data\/Missing_data_one.csv')
print(df.head())
print(df[df['C'].isna()])
'''
          A      B   C
1   not_NaN  0.700 NaN
5   not_NaN  0.972 NaN
11  not_NaN  0.736 NaN
19  not_NaN  0.684 NaN
21  not_NaN  0.913 NaN
'''

(b)现需要将A中的部分单元转为缺失值,单元格中的最小转换概率为25%,且概率大小与所在行B列单元的值成正比。

没读懂题。。。。

【练习二】 现有一份缺失的数据集,记录了36个人来自的地区、身高、体重、年龄和工资,请解决如下问题:

import numpy as np
import pandas as pd
from numpy import nan as NaN

df = pd.read_csv(r'C:\\Users\YANG\Desktop\joyful-pandas-master\data\/Missing_data_two.csv')
print(df.head())
'''
   编号 地区   身高     体重    年龄    工资
0   1    A    157.50    NaN  47.0  15905.0
1   2    B    202.00  91.80  25.0      NaN
2   3    C    169.09  62.18   NaN      NaN
3   4    A    166.61  59.95  77.0   5434.0
4   5    B    185.19    NaN  62.0   4242.0
'''

(a)统计各列缺失的比例并选出在后三列中至少有两个非缺失值的行。

① 统计各列缺失的比例

df = pd.read_csv(r'C:\\Users\YANG\Desktop\joyful-pandas-master\data\/Missing_data_two.csv')
print(df.head())
print((df.isna().sum() / df.shape[0]))  # 打印缺失值的比列
'''
编号    0.000000
地区    0.000000
身高    0.000000
体重    0.222222
年龄    0.250000
工资    0.222222
'''

② 打印后三列中至少有两个非缺失值的行

df = pd.read_csv(r'C:\\Users\YANG\Desktop\joyful-pandas-master\data\/Missing_data_two.csv')
print(df)
print((df.isna().sum() / df.shape[0]))  # 打印缺失值的比列
a = df[df['体重'].isna() & df['年龄'].notna() & df['工资'].notna()]
b = df[df['体重'].notna() & df['年龄'].notna() & df['工资'].isna()]
c = df[df['体重'].notna() & df['年龄'].isna() & df['工资'].notna()]
d = df[df['体重'].notna() & df['年龄'].notna() & df['工资'].notna()]
print(a, b, c, d)
e = pd.concat([a, b, c, d])
print(e.head())
'''
    编号 地区   身高  体重  年龄   工资
0    1    A    157.50 NaN  47.0  15905.0
4    5    B    185.19 NaN  62.0   4242.0
15  16    A    165.68 NaN  46.0  13683.0
23  24    A    165.55 NaN  66.0  19890.0
30  31    C    181.19 NaN  41.0  12616.0
'''

(b)请结合身高列和地区列中的数据,对体重进行合理插值。

df = pd.read_csv(r'C:\\Users\YANG\Desktop\joyful-pandas-master\data\/Missing_data_two.csv')
for name, group in df.groupby('地区'):  # 生成一个可迭代对象, name 是分组名 ,group 是内容
        df.loc[group.index,'体重'] = group[['身高','体重']].sort_values(by='身高').interpolate()['体重']  # 分组填充,这些操作都是在原工作表上进行的,不会返回新的工作表
        df['体重'] = df['体重'].round(decimals=2)  # 限定小数点后的个数为2
print(df.head())
'''
   编号 地区   身高    体重   年龄   工资
0   1    A    157.50  53.58  47.0  15905.0
1   2    B    202.00  91.80  25.0      NaN
2   3    C    169.09  62.18   NaN      NaN
3   4    A    166.61  59.95  77.0   5434.0
4   5    B    185.19  81.75  62.0   4242.0
'''
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值