ich eine Pandas Datenrahmen habe:Finden ersten von Null verschiedenen Wert in jeder Zeile von Pandas 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
Und ich mag eine Serie (keine Liste) der ersten Nicht-Null zurück Wert in jeder Zeile. Dies funktioniert derzeit aber lookup
gibt eine Liste anstelle einer Serie (ich weiß, dass ich die Liste in eine Serie umwandeln kann), aber ich gehe davon aus, es gibt einen besseren Weg:
first_nonzero_colnames = (df > 0).idxmax(axis=1, skipna=True)
df.lookup(first_nonzero_colnames.index, first_nonzero_colnames.values)
[ 2. 1. 13.]
ich .apply
verwenden können, aber ich möchte vermeiden es.
so eine gute Antwort. Ich arbeite immer noch an meinem. aber ich hätte 'df.replace (0, np.nan) .bfill (1) .iloc [:, 0]' – piRSquared
@piRSquared: Ja, ich hatte etwas ähnliches, 'df.mask (df == 0). bfill (1) .iloc [:, 0] ', wurde aber gerade knapp geschlagen! – root
gerade lief '%% timeit' mein Vorschlag nimmt 3. die Zeit, aber es ist das gleiche Konzept. Es macht mir nichts aus, wenn Sie es in Ihre Antwort aufnehmen. – piRSquared