如何在 Python pandas 数据框中任何行具有 NaN 值后删除列

How to remove columns after any row has a NaN value in Python pandas dataframe

玩具示例代码

假设我有以下 DataFrame:

import pandas as pd
import numpy as np
df = pd.DataFrame({"A":[11,21,31], "B":[12,22,32], "C":[np.nan,23,33], "D":[np.nan,24,34], "E":[15,25,35]})

哪个 return:

>>> df
    A   B     C     D   E
0  11  12   NaN   NaN  15
1  21  22  23.0  24.0  25
2  31  32  33.0  34.0  35

删除具有 nan 个值的所有列

我知道如何删除所有具有 nan 值的行的所有列,如下所示:

out1 = df.dropna(axis=1, how="any")

哪个 returns:

>>> out1
    A   B   E
0  11  12  15
1  21  22  25
2  31  32  35

预期输出

然而,我希望在找到 nan 值后删除所有列。在玩具示例代码中,预期输出为:

    A   B
0  11  12
1  21  22
2  31  32

问题

pandas DataFrame 的任何行中找到 nan 后如何删除所有列?

我可以找到如下方法来获得预期的输出:

colFirstNaN = df.isna().any(axis=0).idxmax() # Find column that has first NaN element in any row
indexColLastValue = df.columns.tolist().index(colFirstNaN) -1
ColLastValue = df.columns[indexColLastValue]
out2 = df.loc[:, :ColLastValue]

然后输出将是:

>>> out2
    A   B
0  11  12
1  21  22
2  31  32

我会做什么:

  1. 检查每个元素是否为 null/not null
  2. 各列中每一行的累计和
  3. 跨行检查any每一列
  4. 将该结果用作索引器:
df.loc[:, ~df.isna().cumsum(axis=1).any(axis=0)]

给我:

    A   B
0  11  12
1  21  22
2  31  32