【问题标题】:Drop dataframe columns where all rows AND header is na删除所有行和标题为 na 的数据框列
【发布时间】:2020-01-14 00:14:17
【问题描述】:

我有一个包含多个 NoneType 值的数据框,我想删除所有行值和标题为 None 的所有列。我正在努力寻找一种方法来做到这一点。在下面的 MWE 中,我设法删除了所有行都为 None 的所有列,或者删除了标题为 None 的所有列。

from __future__ import annotations

import pandas as pd

d = [[1, 2, None, None, None], [4, 5, None, None, 7]]
cols = ['a', 'b', 'c', None, None]
df = pd.DataFrame(data=d, columns=cols)

print("Original: \n", df)
#Original: 
#    a  b     c   NaN  NaN
#0  1  2  None  None  NaN
#1  4  5  None  None  7.0

print("\nDropped how = all: \n", df.dropna(axis=1, how="all"))    # Drops column 'c'
#Dropped how = all: 
#    a  b  NaN
#0  1  2  NaN
#1  4  5  7.0

print("\nDropped None columns: \n", df[df.columns.dropna()])
#Dropped None columns: 
#    a  b     c
#0  1  2  None
#1  4  5  None

我怎样才能只删除我想删除的列并得到这个?

#Wanted: 
#    a  b     c  NaN
#0  1  2  None   NaN
#1  4  5  None   7.0

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您可以将 2 个条件与 & 一起使用并反转并使用 .loc[]

df.loc[:,~(df.columns.isna() & df.isna().all())]

   a  b     c  NaN
0  1  2  None  NaN
1  4  5  None  7.0

【讨论】:

  • 德摩根的版本df.loc[:, df.notna().any() | df.columns.notna()]
  • @piRSquared 不错 1,我相信效率更高。谢谢楼主:)
【解决方案2】:

这是使用notnaany 并根据条件对数据帧执行布尔索引的一种方法:

df.loc[:, (df.notna() | df.columns.notna()).any(0)]

   a  b     c  NaN
0  1  2  None  NaN
1  4  5  None  7.0

【讨论】:

    【解决方案3】:

    IIUC

    df.loc[:,df.T.reset_index().notna().any(1).values]
       a  b     c  NaN
    0  1  2  None  NaN
    1  4  5  None  7.0
    

    【讨论】:

    • 这正是我想到的第一件事。好接近df.loc[:, [*df.T.reset_index().notna().any(1)]]
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2016-02-10
    • 2018-10-21
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多