Pandas DataFrame вставляет / заполняет пробелы из предыдущих дат

У меня есть DataFrame состоящий из date s, других столбцов и числового значения, где некоторые комбинации значений в «других столбцах» могут отсутствовать, и я хочу заполнить их с предыдущей date s.

Пример. Скажем, DataFrame похож на ниже. Вы можете увидеть в 2016-01-01 , у нас есть данные для (LN, A) , (LN, B) , (NY, A) и (NY, B) на столбцах (location, band) .

         значение диапазона местоположения даты
 0 2016-01-01 LN A 10,0
 1 2016-01-01 LN B 5.0
 2 2016-01-01 NY A 9.0
 3 2016-01-01 NY B 6.0
 4 2016-01-02 LN A 11.0
 5 2016-01-02 NY B 7.0
 6 2016-01-03 NY A 10.0

Тогда вы заметили, что в 2016-01-02 мы имеем только (LN, A) и (NY, B) , но (LN, B) и (NY, A) отсутствуют. Опять же, 2016-01-03 , 2016-01-03 только (NY, A) ; все остальные три комбинации отсутствуют.

Я хочу, чтобы заполнить недостающие комбинации каждой даты от своего предшественника. Скажем, для 2016-01-02 я хотел бы добавить еще два ряда, «перевернутых» с 2016-01-01 : (LN, B, 5.0) и (NY, A, 9.0) для столбцов (location, band, value) . То же самое для 2016-01-03 . Чтобы сделать все, как показано ниже:

         значение диапазона местоположения даты
  0 2016-01-01 LN A 10,0
  1 2016-01-01 LN B 5.0
  2 2016-01-01 NY A 9.0
  3 2016-01-01 NY B 6.0
  4 2016-01-02 LN A 11.0
  5 2016-01-02 NY B 7.0
  6 2016-01-03 NY A 10.0
  7 2016-01-02 LN B 5.0
  8 2016-01-02 NY A 9.0
  9 2016-01-03 LN A 11,0
 10 2016-01-03 LN B 5.0
 11 2016-01-03 NY B 7.0

Строки примечаний 7-11 заполняются из строк 1, 2, 4, 7 и 5 соответственно. Заказ не имеет особого значения, поскольку я всегда могу сортировать его, если все данные, которые мне нужны, присутствуют.

Кто-нибудь, чтобы помочь? Большое спасибо!

  • как установить PIL на Macosx 10.9?
  • Python читает файл в формате DOT и возвращает список имен городов
  • Почему скрипт выполнения manage.py запускается дважды при его использовании, если __name__ == "__main__"
  • Почему сравнение строк в Python с использованием «==» или «is» иногда приводит к другому результату?
  • Как удалить все символы после определенного символа в python?
  • Как проверить всплывающие окна веб-страниц?
  • Python Удалить суммарную сумму в долларах
  • Что является лучшим менеджером геометрии Tkinter, чем .grid ()
  • 2 Solutions collect form web for “Pandas DataFrame вставляет / заполняет пробелы из предыдущих дат”

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

     # Use unstack/stack to add missing locations. df = df.set_index(['date', 'location', 'band']) \ .unstack(level=['location', 'band']) \ .stack(level=['location', 'band'], dropna=False) # Forward fill NaN values within ['location', 'band'] groups. df = df.groupby(level=['location', 'band']).ffill().reset_index() 

    Или вы можете напрямую построить MultiIndex содержащий все комбинации:

     # Build the full MultiIndex, set the partial MultiIndex, and reindex. levels = ['date', 'location', 'band'] full_idx = pd.MultiIndex.from_product([df[col].unique() for col in levels], names=levels) df = df.set_index(levels).reindex(full_idx) # Forward fill NaN values within ['location', 'band'] groups. df = df.groupby(level=['location', 'band']).ffill().reset_index() 

    Полученный результат для любого метода:

      date location band value 0 2016-01-01 LN A 10.0 1 2016-01-01 LN B 5.0 2 2016-01-01 NY A 9.0 3 2016-01-01 NY B 6.0 4 2016-01-02 LN A 11.0 5 2016-01-02 LN B 5.0 6 2016-01-02 NY A 9.0 7 2016-01-02 NY B 7.0 8 2016-01-03 LN A 11.0 9 2016-01-03 LN B 5.0 10 2016-01-03 NY A 10.0 11 2016-01-03 NY B 7.0 

    Мое решение, вкратце, используя операцию продукта, чтобы получить все комбинации в мультииндексе, затем некоторые укладки и ffill ().

     df =pd.DataFrame({'date': {0: '2016-01-01', 1: '2016-01-01', 2: '2016-01-01', 3: '2016-01-01', 4: '2016-01-02', 5: '2016-01-02', 6: '2016-01-03'}, 'band': {0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'A', 5: 'B', 6: 'A'}, 'location': {0: 'LN', 1: 'LN', 2: 'NY', 3: 'NY', 4: 'LN', 5: 'NY', 6: 'NY'}, 'value': {0: 10, 1: 5, 2: 9, 3: 6, 4: 11, 5: 7, 6: 10}}) unique_dates = df['date'].unique() df.set_index(['date','location','band'],inplace=True) idx = pd.MultiIndex.from_product([unique_dates,['LN','NY'],['A','B']]) df = df.reindex(idx) df = df.unstack(level=[2,1]) 

    который производит:

      value ABAB LN LN NY NY 2016-01-01 10.0000 5.0000 9.0000 6.0000 2016-01-02 11.0000 nan nan 7.0000 2016-01-03 nan nan 10.0000 nan 

    и наконец:

     df = df.ffill() df = df.stack().stack() print df value 2016-01-01 LN A 10.0000 B 5.0000 NY A 9.0000 B 6.0000 2016-01-02 LN A 11.0000 B 5.0000 NY A 9.0000 B 7.0000 2016-01-03 LN A 11.0000 B 5.0000 NY A 10.0000 B 7.0000 
    Interesting Posts

    TypeError: str не поддерживает буферный интерфейс

    Как обрабатывать UnresolvedImport Eclipse (Python)

    Как numpy.ndarray.transpose () переставляет ось массива nd?

    SQLAlchemy Получить первичный ключ с автоинкрементцией до фиксации

    Преобразование строкового представления словаря в словарь?

    Обтекание библиотеки C

    Преобразование между объектами datetime и Pandas Timestamp

    Пожалуйста, представьте библиотеку обработки в Perl или Ruby

    Как написать многомерный массив в текстовый файл?

    Преобразование вложенных списков данных в многомерные массивы Numpy

    Векторизованный поиск

    Кудрявые скобки в python Popen

    как я могу восстановить сеансы старые в телеграмме телемарафона и подключить это снова (без отправки кода)

    Группировка ключей словаря Python в виде списка и создание нового словаря с этим списком в качестве значения

    Объект документа MongoEngine, созданный с использованием функции from_json, не сохраняет

    Python - лучший язык программирования в мире.