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
Jonas Palačionis 5 styczeń 2022, 15:13

2 odpowiedzi

Najlepsza odpowiedź

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
2
mozway 5 styczeń 2022, 15:21

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
1
alirezafnatica 5 styczeń 2022, 15:31