如何在Python Pandas DataFrame中的任何行具有NaN值后删除列

时间:2020-10-09 16:43:36

标签: python pandas dataframe nan

玩具示例代码

假设我关注了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]})

哪个会返回:

>>> 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")

哪个返回:

>>> 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

问题

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

2 个答案:

答案 0 :(得分:4)

我会做什么:

  1. 检查每个元素是否为空/不为空
  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

答案 1 :(得分:0)

我可以找到一种获取预期输出的方法:

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