SS     RR
       10.4
12.6  
 
       5.6
8.7

Я хочу заполнить пустые строки предыдущими значениями.

Ожидаемый результат:

SS     RR
       10.4
12.6   10.4
12.6   10.4      
12.6   5.6
8.7    5.6
8.7    5.6

Я пытаюсь сначала заменить пустые значения на NaN, а затем повторить предыдущие значения:

df[df['SS']==""] = np.NaN
df[df['RR']==""] = np.NaN

df.SS.fillna(method='ffill')
df.RR.fillna(method='ffill')

Но по какой-то причине это не имеет значения для фрейма данных. Что мне здесь не хватает? Благодарность!

РЕДАКТИРОВАТЬ: Что, если я хочу ffill в соответствующем 'ID':

ID     SS     RR
ABC          10.4
ABC   12.6  
ABC     
LMN           5.6
LMN   8.7

Ожидаемый результат:

ID     SS     RR
ABC          10.4
ABC   12.6   10.4
ABC   12.6   10.4
LMN           5.6
LMN   8.7     5.6

Использую ли я функцию groupby и где ее добавить, чтобы все работало? Еще раз спасибо!

0
Ramsey 12 Ноя 2020 в 19:30

3 ответа

Лучший ответ

Вам здесь не нужен fillna , вы можете вызвать ffill() напрямую:

In [1793]: df[['SS', 'RR']] = df[['SS', 'RR']].ffill()

In [1794]: df
Out[1794]: 
     SS    RR
0   NaN  10.4
1  12.6  10.4
2  12.6  10.4
3  12.6   5.6
4   8.7   5.6
1
Mayank Porwal 12 Ноя 2020 в 17:18

Вы должны вернуть его или добавить inplace

df.SS.fillna(method='ffill',inplace=True)
df.RR.fillna(method='ffill',inplace=True)

#df.SS = df.SS.fillna(method='ffill')
#df.RR = df.RR.fillna(method='ffill')
2
BEN_YO 12 Ноя 2020 в 16:34

fillna не работает на месте. Вам нужно будет либо добавить inplace=True к вашим звонкам на fillna, как указано в другом ответе.

В качестве альтернативы вы можете переписать свой код, чтобы перезаписать фрейм данных исправленным выводом.

df = df.replace("", np.nan).ffill()
  • .replace("", np.nan) заменит все пробелы на NaN во всем фрейме данных
  • .ffill() - это ярлык для .fillna(method="ffill")

Поскольку мы не указываем здесь флаг inplace=True, мы можем связать эти методы вместе и перезаписать наш фрейм данных (или создать новый фрейм данных с этими изменениями, изменив имя нашей переменной:

clean_df = df.replace("", np.nan).ffill()
1
Cameron Riddell 12 Ноя 2020 в 16:34