缺失数据处理:在数据处理过程中,缺失数据(missing value)的处理设计删除,替换,差值等操作,这些操作过程中又可能涉及数据类型的改变,可能会导致数据的丢失/破坏。在新版本pandas1.0.5中提出了Nullable类型数据,来(在若干版本之后)解决之前的混乱局面。
https://github.com/datawhalechina/joyful-pandas
这是Pandas在1.0新版本中引入的重大改变,其目的就是为了(在若干版本后)解决之前出现的混乱局面,统一缺失值处理方法
"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
nullable类型包含:nullable整型(Int64),布尔型(boolean),string型
pandas1.0版本之前,np.nan,None,np.NaT在数据与处理的过程中会因为一些操作改变数据类型,以致于数据的使用不便。有了nullable类型之后,有了统一的确实类型pd.NA,在进行数据的处理过程中,即使使用了np.nan,None,np.NaT去改变数据,df中总是存储NA,且不会改变数据类型。
此外,由于nuallable类型的出现,有string类型的数据,解决了object类型数据在调用字符方法后,会根据缺失类型和数据类型而改变的问题,而string类型返回的是Nullable类型。
(a)isna和notna方法:
df.isna()/df.notna()
(b)查看缺失值的所以在行:
df[df[‘xxx’].isna()]
(c)挑选出所有非缺失值列:
df[df.notna().all(1)]/df[df.notna().any(1)]
(a) np.nan
在用equals函数比较时,自动略过两侧全是np.nan的单元格,因此结果不会影响
其次,它在numpy中的类型为浮点,由此导致数据集读入时,即使原来是整数的列,只要有缺失值就会变为浮点型
此外,对于布尔类型的列表,如果是np.nan填充,那么它的值会自动变为True而不是False
但当修改一个布尔列表时,会改变列表类型,而不是赋值为True
在所有的表格读取后,无论列是存放什么类型的数据,默认的缺失值全为np.nan类型,因此整型列转为浮点;而字符由于无法转化为浮点,因此只能归并为object类型(‘O’),原来是浮点型的则类型不变
(b) None
它的布尔值为False
修改布尔列表不会改变数据类型
在传入数值类型后,会自动变为np.nan
在使用equals函数时不会被略过
© np.NaT
NaT是针对时间序列的缺失值,是Pandas的内置类型,可以完全看做时序版本的np.nan,与自己不等,且使用equals是也会被跳过
(a)Nullable整形(Int64)
对于该种类型而言,它与原来标记int上的符号区别在于首字母大写:‘Int’。
有时候有缺失值时,缺失值用 np.nan 会把整列当作float处理,这样对ID类数据会有问题(如身份证号码转成float再转成str或int,原有数据可能丢失了),所以提供了一个“Int64”来处理缺失值,大小写可能是为了区分pandas中的64位整型Int64和numpy中的64位整型int64,而numpy的int64对缺失值的支持不好。
它的好处就在于,其中前面提到的三种缺失值都会被替换为统一的NA符号,且不改变数据类型
(b)Nullable布尔
对于该种类型而言,作用与上面的类似,记号为boolean
(c)string类型
该类型是1.0的一大创新,目的之一就是为了区分开原本含糊不清的object类型,它本质上也属于Nullable类型,因为并不会因为含有缺失而改变类型
此外,和object类型的一点重要区别就在于,在调用字符方法后,string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变
(a)逻辑运算
只需看该逻辑运算的结果是否依赖pd.NA的取值,如果依赖,则结果还是NA,如果不依赖,则直接计算结果
(b)算术运算和比较运算
这里只需记住除了下面两类情况,其他结果都是NA即可
pd.NA ** 0 = 1
1 ** pd.NA =1
这个函数的功能往往就是在读取数据时,就把数据列转为Nullable类型,是1.0的新函数:df.convert_dtypes()
def drop_col(df, col_name, cutoff=0.5):
n = len(df)
cnt = df[col_name].count()
if (float(cnt) / n) < cutoff:
df.drop(col_name, axis=1, inplace=1)
drop_col(df, 'col_1', cutoff=0.75)
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_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)
[1] https://github.com/datawhalechina/joyful-pandas
[2] https://blog.csdn.net/anshuai_aw1/article/details/82347016