Вот длинный путь, который должен быть быстрее, если ваши ненулевые значения имеют тенденцию появляться вблизи начала больших массивов:
import pandas as pd
df = pd.DataFrame([[0, 0, 0],[0, 10, 0],[4, 0, 0],[1, 2, 3]],
columns=['first', 'second', 'third'])
res = [next(((j, i) for i, j in enumerate(df[col]) if j != 0), (0, 0)) for col in df]
df_res = pd.DataFrame(res, columns=['value', 'position'], index=df.columns)
print(df_res)
value position
first 4 2
second 10 1
third 3 3