Скопируйте значения строк фрейма данных по строкам до not null и повторите последовательное значение not null далее

#python #pandas #dataframe

Вопрос:

У меня есть фрейм данных, как показано ниже

    A   B   C      D
0  1   2   3.3   4
1 NaT NaN NaN NaN
2 NaT NaN NaN NaN
3  5   6   7      8
4 NaT NaN NaN NaN
5 NaT NaN NaN NaN
6  9   1   2      3 
7 NaT NaN NaN NaN
8 NaT NaN NaN NaN
 

Мне нужно скопировать значения первой строки (1,2,3,4) до ненулевой строки с индексом 2. Затем скопируйте значения строк (5,6,7,8) до ненулевой строки с индексом 5 и скопируйте (9,1,2,3) до строки с индексом 8 и так далее. Есть ли какой-нибудь способ сделать это в Python или Панд. Быстрая помощь приветствуется! Также необходимо не заменять колонку D

Заполнение столбца C дает 3,3456 в качестве значения для следующей строки

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

  A B C     D
0 1 2 3.3 4
1 1 2 3.3 NaN
2 1 2 3.3 NaN
3 5 6 7 8
4 5 6 7 NaN
5 5 6 7 NaN
6 9 1 2 3 
7 9 1 2 NaN
8 9 1 2 NaN
 

Ответ №1:

Вопрос был изменен, поэтому для прямого заполнения всех столбцов без D использования Index.difference ffill имен столбцов в списке:

 cols = df.columns.difference(['D'])

df[cols] = df[cols].ffill()
 

Или создайте маску для всех имен столбцов без D :

 mask = df.columns != 'D'

df.loc[:, mask] = df.loc[:, mask].ffill()
 

ИЗМЕНИТЬ: Я не могу воспроизвести вашу проблему:

 df = pd.DataFrame({'a':[2114.201789, np.nan, np.nan, 1]})

print (df)
             a
0  2114.201789
1          NaN
2          NaN
3     1.000000

print (df.ffill())
             a
0  2114.201789
1  2114.201789
2  2114.201789
3     1.000000
 

Комментарии:

1. Спасибо. Кроме того, плавающие значения округляются неправильно независимо от значений при использовании ffill

2. Проблема сейчас в плавающих числах

3. @Avinash — хммм, не могли бы вы быть более конкретным?

4. @Avinash — Нужны D целые числа столбцов — целые числа с NaN s ? Или у какого-то столбца есть первая строка NaN , поэтому он не повторяет первые значения?

5. У меня было значение 1,53 для одного из столбцов DF. при использовании ffill () он заполняется как 1.52345. не тот же 1.53