У меня есть панды DataFrame:Найти первое ненулевое значение в каждой строке панд DataFrame
import pandas as pd
df = pd.DataFrame([[0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0],
[1.0, 0.0, 1.0, 3.0, 1.0, 1.0, 7.0, 0.0],
[0.0, 0.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0]
]
, columns=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'])
A B C D E F G H
0 0.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0
1 1.0 0.0 1.0 3.0 1.0 1.0 7.0 0.0
2 0.0 0.0 13.0 14.0 15.0 16.0 17.0 18.0
И я хотел бы вернуть серию (не список) первого ненулевого значение в каждой строке. Это в настоящее время работает, но lookup
возвращает список вместо серии (я знаю, что могу преобразовать список в серии), но я предполагаю, что есть лучший способ:
first_nonzero_colnames = (df > 0).idxmax(axis=1, skipna=True)
df.lookup(first_nonzero_colnames.index, first_nonzero_colnames.values)
[ 2. 1. 13.]
я могу использовать .apply
, но я хочу, чтобы избежать Это.
Такого хорошего ответа. Я все еще работаю над собой. но я бы 'df.replace (0, np.nan) .bfill (1) .iloc [:, 0]' – piRSquared
@piRSquared: Да, у меня было что-то подобное, 'df.mask (df == 0). bfill (1) .iloc [:, 0] ', но был просто избит! – root
просто побежал '%% timeit' мое предложение занимает 3-е место, но это та же концепция. Я не против, если вы включите его в свой ответ. – piRSquared