Заполнение фрейма данных, оставляющее после себя нулевое значение?

#python #pandas

#python #pandas

Вопрос:

Как следует из названия, после использования ffill у меня в фрейме данных остается нулевое значение. Вот пример соответствующей части фрейма данных:

 data = {'03_15_2019': {0: u'tariff rail rates for unit and shuttle train shipments1',
  1: np.nan,
  2: np.nan,
  3: np.nan,
  4: u'unit train'},
 u'bushel2': {0: np.nan, 1: np.nan, 2: np.nan, 3: u'         bushel2', 4: np.nan},
 u'destination_region3': {0: np.nan,
  1: np.nan,
  2: np.nan,
  3: u'Destination region3',
  4: np.nan},
 u'fuel_surcharge_per_car': {0: np.nan,
  1: u'Fuel surcharge per car',
  2: np.nan,
  3: np.nan,
  4: np.nan},
 u'metric_ton': {0: np.nan,
  1: np.nan,
  2: u'Tariff plus surcharge per:',
  3: u'     metric ton',
  4: np.nan},
 u'origin_region3': {0: np.nan, 1: np.nan, 2: np.nan, 3: u'Origin region3', 4: np.nan},
 u'rate_car': {0: np.nan, 1: np.nan, 2: u'Tariff', 3: u'rate/car', 4: np.nan},
 u'y_y4': {0: np.nan, 1: u'Percent', 2: u'change', 3: u'Y/Y4', 4: np.nan}}
df = pd.DataFrame.from_dict(data)
  

Вот код, который я пытаюсь использовать:

 df[df.columns[0]].ffill(inplace = True)
df[df.columns[0]] = df[df.columns[0]].str.lower()
values = df.index[df[df.columns[0]].str.contains("train")].tolist()
  

ошибка возвращается в третьей строке в виде:

 ValueError: cannot index with vector containing NA / NaN values
  

когда я проверяю фрейм данных, он выдает мне это:

 0     tariff rail rates for unit and shuttle train s...
1     tariff rail rates for unit and shuttle train s...
2     tariff rail rates for unit and shuttle train s...
3                                                   NaN
4                                            unit train
  

и что делает это более странным, так это то, что если бы я перезапустил приведенный выше код в новой ячейке jupyter notebook, это сработало бы. Это не работает только при первом запуске.

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

1. Не удается воспроизвести вашу проблему

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

3. добавлен пример фрейма данных

4. Не удается воспроизвести с данным кодом

Ответ №1:

 df[df.columns[0]].ffill(inplace = True)
  

Эта строка заменяет NaN в первом столбце. Когда вы проверяете df после этой строки, это будет не то, что вы опубликовали выше.

Ответ №2:

pandas.DataFrame.ffill поля для прямого заполнения, означающие, что если первые элементы вашего столбца являются NaN , они не будут заполнены (нечего распространять вперед).

Итак, в основном:

 data = {'a': [1,2,None, None], 'b': [None, 2, None, 4]}
df = pd.DataFrame(data)
df.ffill()
  

приведет к:

      a    b
0  1.0  NaN
1  2.0  2.0
2  2.0  2.0
3  2.0  4.0
  

Возможно, вы захотите следовать ffill с помощью fillna , чтобы обрабатывать эти случаи по-другому