Возвращает последнее ненулевое значение в panda df

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных

     col0 col1   col2 col3 col4
0   1   3   6  6  0
1   0   2   8  7  3
2   0   0   4  3  4
3   4   2   2  0  4
 

Логика заключается в том, что если col1 не равен нулю, верните col1 . Если значение col 1 равно нулю, верните значение col2 (ненулевое). Если col 2 равен нулю, верните col3. Нам не нужно ничего делать для col4

Мой код выглядит так, как показано ниже, но он возвращает только col1

 def test(df):
        if df['col1'].iloc[0] > 0:
            return df['col1']
        elif df['col1'].iloc[0] == 0 amp; df['col2'].iloc[0] > 0:
            return df['col2']
        elif df['col2'].iloc[0]  == 0 amp; df['col3'].iloc[0]  > 0:
            return df['col3']
        else:
            return 0
test(new)
 

Я пробовал .any() и .all(), это тоже не работает. Кроме того, есть ли способ сделать этот фрагмент кода более эффективным?

Ответ №1:

Вариант идеи @ALollz, поскольку поиск устарел в pandas 1.2.0:

 indices = np.argmax(df.ne(0).values, axis=1)
print(df.values[np.arange(len(df)), indices])
 

Вывод

 [1 2 4 4]
 

Обновить

Для исключения последнего столбца и возврата 0 сделайте это вместо:

 indices = np.argmax(df.ne(0).iloc[:, :-1].values, axis=1)
result = np.where(df.ne(0).iloc[:, :-1].any(1), df.values[np.arange(len(df)), indices], 0)
print(result)
 

Комментарии:

1. Извините, у меня должен быть столбец 4, который мы не используем. В этом случае len(df) может не работать. Есть ли какой-либо другой способ решить эту проблему. Я обновил вопрос

2. @codelearner0504 Я не понимаю, len(df) дает вам количество строк. Это работает и для нового ввода