numpy pandas 缺失值处理

index_nan = df_info.index[ np.isnan(df_info["type"]) ]
df_info = df_info.loc[df_info.index.drop(index_nan), ]
df_info = df_info.loc[~np.isnan(df_info["type"]), ]
del index_nan

更简单的写法

df_info = df_info.loc[~np.isnan(df_info["type"]), :]
df_info = df_info.loc[np.invert(np.isnan(df_info["type"])), :]


列表推导式
a = [i for i in a if i is not np.nan]

pandas 缺失值处理

#coding=utf-8
import numpy as np
import pandas as pd

#创建DataFrame
df = pd.DataFrame(np.arange(12, 32).reshape((5, 4)), index=["a", "b", "c", "d", "e"], columns=["WW", "XX", "YY", "ZZ"])
df.loc[["b"],["YY"]] = np.nan   # NaN是float类型,对应列会自动变成float类型。
df.loc[["d"],["XX"]] = np.nan
print(df)
  WW    XX    YY  ZZ
a  12  13.0  14.0  15
b  16  17.0   NaN  19
c  20  21.0  22.0  23
d  24   NaN  26.0  27
e  28  29.0  30.0  31
  • pandas判断是否是NaN
    print(pd.isnull(df))

          WW     XX     YY     ZZ
    a  False  False  False  False
    b  False  False   True  False
    c  False  False  False  False
    d  False   True  False  False
    e  False  False  False  False
    
  • pandas判断是否不是NaN
    print(pd.notnull(df))

         WW     XX     YY    ZZ
    a  True   True   True  True
    b  True   True  False  True
    c  True   True   True  True
    d  True  False   True  True
    e  True   True   True  True
    
  • 也可以只判断某一列的NaN
    print(pd.notnull(df["XX"]))

    a     True
    b     True
    c     True
    d    False
    e     True
    Name: XX, dtype: bool
    
  • 布尔索引
    print(df[pd.notnull(df["YY"])]) # 选出"YY"列不为NaN的所有行

       WW    XX    YY  ZZ
    a  12  13.0  14.0  15
    c  20  21.0  22.0  23
    d  24   NaN  26.0  27
    e  28  29.0  30.0  31
    
  • NaN的处理方式一:直接删除
    df1 = df.dropna(axis=0) # axis=0表示删除行,axis=1表示删除列
    print(df1)

       WW    XX    YY  ZZ
    a  12  13.0  14.0  15
    c  20  21.0  22.0  23
    e  28  29.0  30.0  31
    

    df2 = df.dropna(axis=0, how="all") # how="all"表示某行(列)全为NaN才会删除。how="any"表示只要有一个NaN就会删除(默认)。
    df.dropna(axis=0, inplace=True) # inplace=True表示原地修改,修改后的结果直接作用于原df。 默认False

  • NaN的处理方式二:填充
    df2 = df.fillna(100) # 填充成100

    • 填充平均值
      df3 = df.fillna(df.mean()) # df.mean()表示每一列的平均值(Series类型)。 df.median()中位数

    • 可以只填充某一列
      df4 = df["YY"].fillna(df["YY"].mean()) # df.mean()表示每一列的平均值(Series类型)
      df["YY"] = df["YY"].fillna(df["YY"].mean()) # 只填充某一列,再赋值给原df的对应列。

  • 计算均值时,NaN不会参与计算,但0会
    df[df==0] = np.nan # df.mean()计算均值时,NaN不会参与计算,但0会

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值