Pandas按行查找第一个nan值并返回列名

use*_*128 5 python pandas

我有这样的数据帧

>>df1 = pd.DataFrame({'A': ['1', '2', '3', '4','5'],
              'B': ['1', '1', '1', '1','1'],
              'C': ['c', 'A1', None, 'c3',None],
              'D': ['d0', 'B1', 'B2', None,'B4'],
              'E': ['A', None, 'S', None,'S'],
              'F': ['3', '4', '5', '6','7'],
              'G': ['2', '2', None, '2','2']})
>>df1

   A  B     C     D     E  F     G
0  1  1     c    d0     A  3     2
1  2  1    A1    B1  None  4     2
2  3  1  None    B2     S  5  None
3  4  1    c3  None  None  6     2
4  5  1  None    B4     S  7     2
Run Code Online (Sandbox Code Playgroud)

然后我删除包含nan值的行df2 = df1.dropna()

   A  B     C     D     E  F     G   
1  2  1    A1    B1  None  4     2
2  3  1  None    B2     S  5  None
3  4  1    c3  None  None  6     2
4  5  1  None    B4     S  7     2
Run Code Online (Sandbox Code Playgroud)

由于这些行包含nan值,因此这是一个丢弃的数据帧.但是,我想知道为什么会被丢弃?哪一列是"第一个纳米值列",该行被删除了?我需要一个失败的报告理由.

输出应该是

['E','C','D','C']
Run Code Online (Sandbox Code Playgroud)

我知道我可以dropna通过每一列然后记录它作为原因但它实际上是无效的.

有没有更有效的方法来解决这个问题?谢谢

jez*_*ael 8

我想你可以创建布尔数据帧DataFrame.isnull,然后通过过滤boolean indexing用面膜哪里至少一个True通过any和最后一个idxmax-你得到第一的列名True的值DataFrame:

booldf = df1.isnull()
print (booldf)
       A      B      C      D      E      F      G
0  False  False  False  False  False  False  False
1  False  False  False  False   True  False  False
2  False  False   True  False  False  False   True
3  False  False  False   True   True  False  False
4  False  False   True  False  False  False  False

print (booldf.any(axis=1))
0    False
1     True
2     True
3     True
4     True
dtype: bool

print (booldf[booldf.any(axis=1)].idxmax(axis=1))
1    E
2    C
3    D
4    C
dtype: object
Run Code Online (Sandbox Code Playgroud)