#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) дает вам количество строк. Это работает и для нового ввода