Заменить нули на последнее значение, отличное от нуля - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий фрейм данных:

print(inventory_df)

      dt_op  Prod_1  Prod_2  Prod_n
1  10/09/18       5      50       2
2  11/09/18       4       0       0
3  12/09/18       2       0       0
4  13/09/18       0       0       0
5  14/09/18       4      30       1

Я хотел бы изменить значения, равные нулю, с последним значением! = От нуля, в каждом столбце, как:

print(final_inventory_df)

      dt_op  Prod_1  Prod_2  Prod_n
1  10/09/18       5      50       2
2  11/09/18       4      50       2
3  12/09/18       2      50       2
4  13/09/18       2      50       2
5  14/09/18       4      30       1

Как я мог это сделать?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Просто еще один вариант:

df.iloc[:,1:] = df.iloc[:,1:].replace(0, np.nan).ffill().astype(int)
0 голосов
/ 23 ноября 2018

Идея состоит в том, чтобы заменить 0 на NaN на mask и затем заполнить их предыдущими не пропущенными значениями:

cols = df.columns.difference(['dt_op'])
df[cols] = df[cols].mask(df[cols] == 0).ffill().astype(int)

Аналогичное решение с numpy.where:

df[cols] = pd.DataFrame(np.where(df[cols] == 0, np.nan, df[cols]), 
                        index=df.index, 
                        columns=cols).ffill().astype(int)


print (df)
      dt_op  Prod_1  Prod_2  Prod_n
1  10/09/18       5      50       2
2  11/09/18       4      50       2
3  12/09/18       2      50       2
4  13/09/18       2      50       2
5  14/09/18       4      30       1

Решение для развлечения - конвертируйте в целые числа все столбцы без dt_op:

d = dict.fromkeys(df.columns.difference(['dt_op']), 'int')
df = df.mask(df == 0).ffill().astype(d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...