[英]Need to fetch column name based on first non NaN value, and return that column name in a new column
[英]Pandas find first nan value by rows and return column name
我有這樣的數據幀
>>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
並刪除包含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
由於這些行包含nan值,因此這是一個丟棄的數據幀。 但是,我想知道為什么會被丟棄? 哪一列是“第一個納米值列”,該行被刪除了? 我需要一個失敗的報告理由。
輸出應該是
['E','C','D','C']
我知道我可以通過每一列做dropna
然后記錄它作為原因但它實際上是非效率的。
有沒有更有效的方法來解決這個問題? 謝謝
我想你可以通過創建布爾數據框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
我會使用itertools
和numpy.where
的組合,以及pd.DataFrame.isnull
:
>>> df1.isnull()
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
>>> from itertools import *
>>> r,c = np.where(df1.isnull().values)
>>> first_cols = [next(g)[1] for _, g in groupby(izip(r,c), lambda t:t[0])]
>>> df1.columns[first_cols]
Index([u'E', u'C', u'D', u'C'], dtype='object')
>>>
對於Python 2,使用itertools
izip
,而在Python 3中使用內置zip
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.