Mam df
:
1 2 3 4 5 6 7 8 9 10
A 10 0 0 15 0 21 45 0 0 7
Próbuję wypełnić wartości indeksu A
bieżącą wartością, jeśli następna wartość to 0
, aby df
wyglądało tak:
1 2 3 4 5 6 7 8 9 10
A 10 10 10 15 15 21 45 45 45 7
Próbowałem:
df.loc[['A']].replace(to_replace=0, method='ffill').values
Ale to nie działa, gdzie jest mój błąd?
2 odpowiedzi
Jeśli chcesz użyć swojej metody, musisz pracować z Serią po obu stronach:
df.loc['A'] = df.loc['A'].replace(to_replace=0, method='ffill')
Alternatywnie możesz mask
0 z NaNs i ffill
dane na axis=1
:
df.mask(df.eq(0)).ffill(axis=1)
Wynik:
1 2 3 4 5 6 7 8 9 10
A 10.0 10.0 10.0 15.0 15.0 21.0 45.0 45.0 45.0 7.0
Cóż, powinieneś trochę zmienić swój kod i pracować z series
:
import pandas as pd
df = pd.DataFrame({'1': [10], '2': [0], '3': [0], '4': [15], '5': [0],
'6': [21], '7': [45], '8': [0], '9': [0], '10': [7]},
index=['A'])
print(df.apply(lambda x: pd.Series(x.values).replace(to_replace=0, method='ffill').values, axis=1))
Wynik:
A [10, 10, 10, 15, 15, 21, 45, 45, 45, 7]
dtype: object
W ten sposób, jeśli masz wiele indeksów, kod nadal działa:
import pandas as pd
df = pd.DataFrame({'1': [10, 11], '2': [0, 12], '3': [0, 0], '4': [15, 0], '5': [0, 3],
'6': [21, 3], '7': [45, 0], '8': [0, 4], '9': [0, 5], '10': [7, 0]},
index=['A', 'B'])
print(df.apply(lambda x: pd.Series(x.values).replace(to_replace=0, method='ffill').values, axis=1))
Wynik:
A [10, 10, 10, 15, 15, 21, 45, 45, 45, 7]
B [11, 12, 12, 12, 3, 3, 3, 4, 5, 5]
dtype: object
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.