如何在 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
我会做什么:
- 检查每个元素是否为 null/not null
- 各列中每一行的累计和
- 跨行检查
any
每一列
- 将该结果用作索引器:
df.loc[:, ~df.isna().cumsum(axis=1).any(axis=0)]
给我:
A B
0 11 12
1 21 22
2 31 32
玩具示例代码
假设我有以下 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
我会做什么:
- 检查每个元素是否为 null/not null
- 各列中每一行的累计和
- 跨行检查
any
每一列 - 将该结果用作索引器:
df.loc[:, ~df.isna().cumsum(axis=1).any(axis=0)]
给我:
A B
0 11 12
1 21 22
2 31 32