В чем разница между ffill в python как цепочечным методом и параметром? - PullRequest
0 голосов
/ 15 февраля 2019

Допустим, мы пытаемся переиндексировать фрейм данных по списку следующим образом:

dataframe.reindex(list)

, где точный фрейм данных и список не важны.

Теперь, если список большечем исходный индекс, будет несколько NaN.Мой вопрос заключается в том, хочу ли я заполнить NaN с помощью прямого заполнения, в чем разница между двумя способами ниже:

dataframe.reindex(list, method='ffill')

dataframe.reindex(list).ffill()

Я пробовал несколько раз и обнаружил, что результаты отличаются.

Скажем, у нас есть датафрейм:

Jan   1  
Apr   2  
Jul   3  
Oct   4  

и список:
list = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

Итак,

dataframe.reindex(list, method='ffill')

становится:

Jan   1  
Feb   2  
Mar   3  
Apr   2  
May   3  
Jun   3  
Jul   3  
Aug   2  
Sep   4  
Oct   4  
Nov   3  
Dec   2  

Принимая во внимание, что

dataframe.reindex(list).ffill()

становится:

Jan   1  
Feb   1  
Mar   1  
Apr   2  
May   2  
Jun   2  
Jul   3  
Aug   3  
Sep   3  
Oct   4  
Nov   4  
Dec   4 

Я не мог понять, как эти два пути различаются?Что будет производить первый и что будет производить второй?

Я попытался найти в документации и других источниках, но не смог найти объяснения.Заранее большое спасибо.

1 Ответ

0 голосов
/ 15 февраля 2019

РЕДАКТИРОВАТЬ:

В версии pandas 0.24.1 возникает ошибка:

print (dataframe)
     Col
Jan    1
Apr    2
Jul    3
Oct    4

print (dataframe.index.is_monotonic_increasing)
False

L = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

print (dataframe.reindex(L, method='ffill'))

ValueError: индекс должен быть монотонным при увеличении или уменьшении

И в документах - DataFrame.reindex:

метод : {Нет, 'обратная засыпка' / 'bfill', 'pad' / 'ffill', 'near'}
Метод, используемый для заполнения дырок в переиндексированном DataFrame.Обратите внимание: это применимо только к DataFrames / Series с монотонно увеличивающимся / убывающим индексом.

Нет (по умолчанию): не заполнять пробелы pad / ffill: распространять последнее действительное наблюдение вперед до следующей действительной засыпки / bfill: использовать следующее действительное наблюдение, чтобы заполнить пробел, ближайший: использовать ближайшие действительные наблюдения, чтобы заполнить пробел

Второй рабочий вариант:

print (dataframe.reindex(L).ffill())
     Col
Jan  1.0
Feb  1.0
Mar  1.0
Apr  2.0
May  2.0
Jun  2.0
Jul  3.0
Aug  3.0
Sep  3.0
Oct  4.0
Nov  4.0
Dec  4.0

Примечание - Не используйте list какпеременная, потому что Python зарезервированное слово (встроенные).

Разница в том, если пропущенные значения находятся в столбце до reindex:

dataframe = pd.DataFrame({'col':[0,2,np.nan,5,np.nan]}, index=[1,3,5,6,8])
print (dataframe)
   col
1  0.0
3  2.0
5  NaN
6  5.0
8  NaN

print (dataframe.index.is_monotonic_increasing)
True

Если использовать параметр, то вперед заполнить только добавленные строки, здесь 1, 4,7 строки.

Если цепочка ffill, то создаются пропущенные значения и все данные Серии заполняются в прямом направлении:

L = range(10)
df = pd.concat([dataframe.reindex(L, method='ffill'),
                dataframe.reindex(L),
                dataframe.reindex(L).ffill()], 
                keys=('parameter','only_reindex','chained'), axis=1)
print (df)
  parameter only_reindex chained
        col          col     col
0       NaN          NaN     NaN
1       0.0          0.0     0.0
2       0.0          NaN     0.0
3       2.0          2.0     2.0
4       2.0          NaN     2.0
5       NaN          NaN     2.0
6       5.0          5.0     5.0
7       5.0          NaN     5.0
8       NaN          NaN     5.0
9       NaN          NaN     5.0

Если результат пропущенных значений не совпадает:

dataframe = pd.DataFrame({'col':[0,2,8,5,9]}, index=[1,3,5,6,8])
print (dataframe)
   col
1    0
3    2
5    8
6    5
8    9

print (dataframe.index.is_monotonic_increasing)
True

L = range(10)
df = pd.concat([dataframe.reindex(L, method='ffill'),
                dataframe.reindex(L),
                dataframe.reindex(L).ffill()], 
                keys=('parameter','only_reindex','chained'), axis=1)
print (df)
  parameter only_reindex chained
        col          col     col
0       NaN          NaN     NaN
1       0.0          0.0     0.0
2       0.0          NaN     0.0
3       2.0          2.0     2.0
4       2.0          NaN     2.0
5       8.0          8.0     8.0
6       5.0          5.0     5.0
7       5.0          NaN     5.0
8       9.0          9.0     9.0
9       9.0          NaN     9.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...