Pandas第六章缺失值打卡

本文探讨了数据处理中缺失值的策略,包括删除、插值等方法,并通过实例展示了如何使用Python Pandas库进行操作,如筛选特定类型的列、按条件转换数据及合理插值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

五、问题与练习¶

  1. 问题
    【问题一】 如何删除缺失值占比超过25%的列?
    【问题二】 什么是Nullable类型?请谈谈为什么要引入这个设计?
    【问题三】 对于一份有缺失值的数据,可以采取哪些策略或方法深化对它的了解?
  2. 练习
    【练习一】现有一份虚拟数据集,列类型分别为string/浮点/整型,请解决如下问题:
    (a)请以列类型读入数据,并选出C为缺失值的行。
    (b)现需要将A中的部分单元转为缺失值,单元格中的最小转换概率为25%,且概率大小与所在行B列单元的值成正比。
    In [105]:
    pd.read_csv(‘data/Missing_data_one.csv’).head()
    Out[105]:
    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
    【练习二】 现有一份缺失的数据集,记录了36个人来自的地区、身高、体重、年龄和工资,请解决如下问题:
    (a)统计各列缺失的比例并选出在后三列中至少有两个非缺失值的行。
    (b)请结合身高列和地区列中的数据,对体重进行合理插值。
    In [106]:
    pd.read_csv(‘data/Missing_data_two.csv’).head()
    Out[106]:
    编号 地区 身高 体重 年龄 工资
    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

第6章:练习一
(a)
In [55]:
df = pd.read_csv(‘data/Missing_data_one.csv’).convert_dtypes()
df.head()
Out[55]:
A B C
0 not_NaN 0.922 4
1 not_NaN 0.700
2 not_NaN 0.503 8
3 not_NaN 0.938 4
4 not_NaN 0.952 10
In [56]:
df.dtypes
Out[56]:
A string
B float64
C Int64
dtype: object
In [57]:
df[df[‘C’].isna()]
Out[57]:
A B C
1 not_NaN 0.700
5 not_NaN 0.972
11 not_NaN 0.736
19 not_NaN 0.684
21 not_NaN 0.913
(b)
In [58]:
df = pd.read_csv(‘data/Missing_data_one.csv’).convert_dtypes()
total_b = df[‘B’].sum()
min_b = df[‘B’].min()
df[‘A’] = pd.Series(list(zip(df[‘A’].values
,df[‘B’].values))).apply(lambda x:x[0] if np.random.rand()>0.25*x[1]/min_b else np.nan)
df.head()
Out[58]:
A B C
0 not_NaN 0.922 4
1 not_NaN 0.700
2 not_NaN 0.503 8
3 NaN 0.938 4
4 NaN 0.952 10
第6章:练习二
(a)
In [59]:
df = pd.read_csv(‘data/Missing_data_two.csv’)
df.head()
Out[59]:
编号 地区 身高 体重 年龄 工资
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
In [60]:
df.isna().sum()/df.shape[0]
Out[60]:
编号 0.000000
地区 0.000000
身高 0.000000
体重 0.222222
年龄 0.250000
工资 0.222222
dtype: float64
In [61]:
df_not2na = df[df.iloc[:,-3:].isna().sum(1)<=1]
df_not2na.head()
Out[61]:
编号 地区 身高 体重 年龄 工资
0 1 A 157.50 NaN 47.0 15905.0
1 2 B 202.00 91.80 25.0 NaN
3 4 A 166.61 59.95 77.0 5434.0
4 5 B 185.19 NaN 62.0 4242.0
5 6 A 187.13 78.42 55.0 13959.0
(b)
分地区,用排序后的身高信息进行线性插值
In [62]:
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()
Out[62]:
编号 地区 身高 体重 年龄 工资
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值