Заполните Nat в колонке с пандами [дубликат]

Многие способы скинуть кошку здесь и . Предложение Митча - хороший способ. Если вы хотите, чтобы в клиентской форме было больше «контроля», вы можете передать экземпляр родителя ребенку при его создании, а затем вы можете вызвать любой открытый родительский метод для дочернего элемента.

47
задан Alex Riley 30 December 2016 в 16:26
поделиться

6 ответов

Вы можете использовать метод fillna в DataFrame и указать метод как ffill (форвардная заливка):

>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df.fillna(method='ffill')
   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

Этот метод ...

распространять [s] последнее действительное наблюдение вперед к следующему действительному

. Чтобы перейти в другую сторону, существует также метод bfill.

Этот метод не изменяет DataFrame inplace - вам нужно будет перестроить возвращаемый DataFrame в переменную или указать inplace=True:

df.fillna(method='ffill', inplace=True)
77
ответ дан Alex Riley 17 August 2018 в 12:26
поделиться

В моем случае у нас есть временные ряды с разных устройств, но некоторые устройства не могли отправить какое-либо значение в течение некоторого периода времени. Таким образом, мы должны создавать значения NA для каждого устройства и период времени, а затем делать fillna.

df = pd.DataFrame([["device1", 1, 'first val of device1'], ["device2", 2, 'first val of device2'], ["device3", 3, 'first val of device3']])
df.pivot(index=1, columns=0, values=2).fillna(method='ffill').unstack().reset_index(name='value')

Результат:

        0   1   value
0   device1     1   first val of device1
1   device1     2   first val of device1
2   device1     3   first val of device1
3   device2     1   None
4   device2     2   first val of device2
5   device2     3   first val of device2
6   device3     1   None
7   device3     2   None
8   device3     3   first val of device3
0
ответ дан Anton Shelin 17 August 2018 в 12:26
поделиться

Ответ принят. У меня была связанная, но немного другая ситуация, когда мне приходилось заполнять форму, но только внутри групп. Если у кого-то есть такая же потребность, знайте, что fillna работает над объектом DataFrameGroupBy.

>>> example = pd.DataFrame({'number':[0,1,2,nan,4,nan,6,7,8,9],'name':list('aaabbbcccc')})
>>> example
  name  number
0    a     0.0
1    a     1.0
2    a     2.0
3    b     NaN
4    b     4.0
5    b     NaN
6    c     6.0
7    c     7.0
8    c     8.0
9    c     9.0
>>> example.groupby('name')['number'].fillna(method='ffill') # fill in row 5 but not row 3
0    0.0
1    1.0
2    2.0
3    NaN
4    4.0
5    4.0
6    6.0
7    7.0
8    8.0
9    9.0
Name: number, dtype: float64
7
ответ дан ErnestScribbler 17 August 2018 в 12:26
поделиться

Вы можете использовать pandas.DataFrame.fillna с опцией method='ffill'. 'ffill' означает «прямое заполнение» и будет распространять последнее действительное наблюдение вперед. Альтернативой является 'bfill', который работает одинаково, но обратный.

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
df = df.fillna(method='ffill')

print(df)
#   0  1  2
#0  1  2  3
#1  4  2  3
#2  4  2  9

Для этого также существует функция прямого синонима, pandas.DataFrame.ffill , чтобы сделать вещи проще .

10
ответ дан Ffisegydd 17 August 2018 в 12:26
поделиться

Одна вещь, которую я заметил при попытке этого решения, состоит в том, что если у вас есть N / A в начале или в конце массива, ffill и bfill не совсем работают. Вам нужны оба.

In [224]: df = pd.DataFrame([None, 1, 2, 3, None, 4, 5, 6, None])

In [225]: df.ffill()
Out[225]:
     0
0  NaN
1  1.0
...
7  6.0
8  6.0

In [226]: df.bfill()
Out[226]:
     0
0  1.0
1  1.0
...
7  6.0
8  NaN

In [227]: df.bfill().ffill()
Out[227]:
     0
0  1.0
1  1.0
...
7  6.0
8  6.0
5
ответ дан jjs 17 August 2018 в 12:26
поделиться
  • 1
    Brilliant. Мне нужно именно это для моей проблемы. Заполнение как до, так и после. Большое спасибо. – Prometheus 22 April 2018 в 16:46

ffill теперь имеет свой собственный метод pd.DataFrame.ffill

df.ffill()

     0    1    2
0  1.0  2.0  3.0
1  4.0  2.0  3.0
2  4.0  2.0  9.0
0
ответ дан piRSquared 17 August 2018 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: