查找行

时间:2018-06-09 15:42:10

标签: python pandas numpy nan

我有一个类似的数据框:

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

提前感谢任何意见/建议!

3 个答案:

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

感谢任何人的帮助!