我有一个类似的数据框:
table = pd.DataFrame({'a':[0,0,0,0],
'b':[1,1,1,3,],
'c':[2,2,5,4],
'd':[3,np.NaN,6,6],
'e':[4,np.NaN, 7,8],
'f':[np.NaN,np.NaN,np.NaN,10,]}, dtype='float64')
a b c d e f
0 0.0 1.0 2.0 3.0 4.0 NaN
1 0.0 1.0 2.0 NaN NaN NaN
2 0.0 1.0 5.0 6.0 7.0 NaN
3 0.0 3.0 4.0 6.0 8.0 10.0
对于每一行,我都试图找到第一个NaN值的列索引。这样我就可以将该值存储在变量中以便以后使用它。
到目前为止,我尝试了这段代码,但它没有给我我想要的东西..我不想要一个数组,只是一个值。
for i in table.itertuples():
x = np.where(np.isnan(i))
print(x)
(array([6]),)
(array([4, 5, 6]),)
(array([6]),)
(array([], dtype=int64),)
提前感谢任何意见/建议!
答案 0 :(得分:3)
检查na
,按行获取最大值索引,并筛选出根本没有na
的行。
table.isna().idxmax(1).where(table.isna().any(1))
#0 f
#1 d
#2 f
#3 NaN
#dtype: object
或者如果您需要列索引,如@hpaulj所评论,您可以使用argmax
:
import numpy as np
is_missing = table.isna().values
np.where(is_missing.any(1), is_missing.argmax(1), np.nan)
# array([ 5., 3., 5., nan])
答案 1 :(得分:2)
使用:
t = np.isnan(table.values).argmax(axis=1)
print (t)
[5 3 5 0]
但是如果需要为非NaN
行添加一个值:
t = np.isnan(table.reset_index().values).argmax(axis=1)
print (t)
[6 4 6 0]
答案 2 :(得分:0)
我通过调整代码并使用@hpaulj提到的argmax()
来获得我想要的东西:
for i in table.itertuples():
x = np.isnan(i).argmax(axis=0)
print(x)
#6
#4
#6
#0
感谢任何人的帮助!