题题题…
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
'''