【问题标题】:pandas how to drop rows when all float columns are NaN当所有浮点列都是 NaN 时,熊猫如何删除行
【发布时间】:2019-09-08 12:42:55
【问题描述】:

我有以下 df

  AAA BBB CCC DDD  ID1  ID2  ID3  ID4
0 txt txt txt txt  10   NaN  12   NaN
1 txt txt txt txt  10   NaN  12   13
2 txt txt txt txt  NaN  NaN  NaN  NaN

具有以下数据类型

AAA          object
BBB          object
CCC          object
DDD          object
ID1          float64
ID2          float64
ID3          float64
ID4          float64

有没有办法只在所有浮点列都是 NaN 时才删除行?

输出:

  AAA BBB CCC DDD  ID1  ID2  ID3  ID4
0 txt txt txt txt  10   NaN  12   NaN
1 txt txt txt txt  10   NaN  12   13

我不能用 df.dropna(subset=['ID1','ID2','ID3','ID4']) 因为我真正的 df 有几个动态浮动列。

谢谢

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

使用DataFrame.select_dtypes 获取所有浮点列,然后测试非缺失值并通过DataFrame.any 选择每行至少一个非错误值 - 因此删除了错误浮动行:

df1 = df[df.select_dtypes(float).notna().any(axis=1)]
print (df1)
   AAA  BBB  CCC  DDD   ID1  ID2   ID3   ID4
0  txt  txt  txt  txt  10.0  NaN  12.0   NaN
1  txt  txt  txt  txt  10.0  NaN  12.0  13.0

您的DataFrame.dropna 解决方案应更改为传递浮点列和参数how='all' 以测试每行是否所有NaNs:

df1 = df.dropna(subset=df.select_dtypes(float).columns, how='all')
#for return same dataframe 
#df.dropna(subset=df.select_dtypes(float).columns, how='all', inplace=True)

如果可能的话,通过np.floating检查多种类型的浮点数:

df1 = df.dropna(subset=df.select_dtypes(np.floating).columns, how='all')

【讨论】:

  • 这个答案是有缺陷的,因为它假设只有 float64 dtypes。检查我的编辑;p
  • @rafaelc - 嗯,如果使用df['ID5'] = np.array([1,2,np.nan]),我的代码可以完美运行,但如果可能,多个float 类型需要print ( df.select_dtypes(include=np.floating).columns.tolist())
【解决方案2】:

您可以将NaN 替换为0,然后删除那些仅包含NaN 的列

df.loc[:,~df.replace(0,np.nan).isna().all()]

【讨论】:

    【解决方案3】:

    使用

    df.dropna(subset=df.select_dtypes(include=np.number).columns, how='all')
    

    我建议使用include=np.number,因为它包含所有float dtypes - 所有可能包含NaN。当您使用include=float 时,您只需获得标准的npfloat64 dtype

    为了说明:

    df['ID5'] = np.array([1,2,np.nan], dtype=np.float16)
    
    
    >>> df.select_dtypes(include=float).columns.tolist()
    ['ID1', 'ID2', 'ID3', 'ID4']
    
    >>> df.select_dtypes(include=np.number).columns.tolist()
    ['ID1', 'ID2', 'ID3', 'ID4', 'ID5']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2013-12-12
      • 1970-01-01
      • 2015-05-10
      • 2020-10-12
      • 2019-04-24
      • 2018-12-18
      相关资源
      最近更新 更多