【问题标题】:removing rows with any column containing NaN, NaTs, and nans删除包含 NaN、NaT 和 nans 的任何列的行
【发布时间】:2016-08-24 22:38:35
【问题描述】:

目前我的数据如下:

df_all.head()
Out[2]: 
   Unnamed: 0 Symbol       Date      Close       Weight
0        4061      A 2016-01-13  36.515889   (0.000002)
1        4062     AA 2016-01-14  36.351784    0.000112 
2        4063    AAC 2016-01-15  36.351784   (0.000004)
3        4064    AAL 2016-01-19  36.590483    0.000006 
4        4065   AAMC 2016-01-20  35.934062    0.000002 

df_all.tail()
Out[3]: 
         Unnamed: 0 Symbol Date  Close Weight
1252498    26950320    nan  NaT   9.84    NaN
1252499    26950321    nan  NaT  10.26    NaN
1252500    26950322    nan  NaT   9.99    NaN
1252501    26950323    nan  NaT   9.11    NaN
1252502    26950324    nan  NaT   9.18    NaN

df_all.dtypes
Out[4]: 
Unnamed: 0             int64
Symbol                object
Date          datetime64[ns]
Close                float64
Weight                object
dtype: object

可以看出,我在 nan 的符号中获取值,Nat 代表日期,NaN 代表重量。

我的目标:我想删除任何包含 nan、Nat 或 NaN 列的任何行,并有一个新的 df_clean 作为结果

我似乎无法应用适当的过滤器?我不确定是否必须先转换数据类型(尽管我也尝试过)

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    你可以使用

    df_all.replace({'nan': None})[~pd.isnull(df_all).any(axis=1)]
    

    这是因为isnullNaNNaT 都识别为“空”值。

    【讨论】:

    • 非常感谢
    • @John 请注意,我已经更新了您的问题,因为标题可以更好地反映您需要删除的不仅是 NaNs,还有 NaTs 和 nans .这也需要在此处进行小幅更新。
    • df_all.replace({'nan': None}).dropna() 在这里会不会更好?
    【解决方案2】:

    因此,dropna()isnull() 无法捕获符号“nan'”。您需要将符号'nan' 转换为np.nan

    试试这个:

     df["symbol"] = np.where(df["symbol"]=='nan',np.nan, df["symbol"] )
     df.dropna()
    

    【讨论】:

    • 想听听反对的理由!幸运是因为 'nan' 恰好在同一行 NaT 或 NaN,并不能保证它会被删除。
    • .@Ami 很高兴您编辑了答案!在我指出逻辑错误之后。编写的代码失败。你测试了吗?
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多