Как расширить фрейм данных pandas, повторив последнюю строку и увеличив индекс на один год одновременно - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующий фрейм данных:

import numpy as np
import pandas as pd
dates = pd.date_range('1/1/2014', periods=4)
df = pd.DataFrame(np.eye(4, 4), index=dates, columns=['A', 'B', 'C', 'D'])
print(df)


            A    B    C    D
2014-01-01  1.0  0.0  0.0  0.0
2014-01-02  0.0  1.0  0.0  0.0
2014-01-03  0.0  0.0  1.0  0.0
2014-01-04  0.0  0.0  0.0  1.0

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

for i in range(3):
    df = df.append(df[-1:])
print(df)

             A    B    C    D
2014-01-01  1.0  0.0  0.0  0.0
2014-01-02  0.0  1.0  0.0  0.0
2014-01-03  0.0  0.0  1.0  0.0
2014-01-04  0.0  0.0  0.0  1.0
2014-01-04  0.0  0.0  0.0  1.0
2014-01-04  0.0  0.0  0.0  1.0
2014-01-04  0.0  0.0  0.0  1.0

Однако я хотел бы также увеличить индекс нагод в то же время.Есть идеи, как это сделать?

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

             A    B    C    D
2014-01-01  1.0  0.0  0.0  0.0
2014-01-02  0.0  1.0  0.0  0.0
2014-01-03  0.0  0.0  1.0  0.0
2014-01-04  0.0  0.0  0.0  1.0
2015-01-04  0.0  0.0  0.0  1.0
2016-01-04  0.0  0.0  0.0  1.0
2017-01-04  0.0  0.0  0.0  1.0

Большое спасибо,

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

В несколько строк:

rows_to_add = 10

new_dates = pd.DatetimeIndex([df.index[-1] + pd.DateOffset(years=y)
                               for y in range(rows_to_add)])

df.reindex(df.index.union(new_dates).unique().sort_values()).ffill()

              A    B    C    D
2014-01-01  1.0  0.0  0.0  0.0
2014-01-02  0.0  1.0  0.0  0.0
2014-01-03  0.0  0.0  1.0  0.0
2014-01-04  0.0  0.0  0.0  1.0
2015-01-04  0.0  0.0  0.0  1.0
2016-01-04  0.0  0.0  0.0  1.0
2017-01-04  0.0  0.0  0.0  1.0
2018-01-04  0.0  0.0  0.0  1.0
2019-01-04  0.0  0.0  0.0  1.0
2020-01-04  0.0  0.0  0.0  1.0
2021-01-04  0.0  0.0  0.0  1.0
2022-01-04  0.0  0.0  0.0  1.0
2023-01-04  0.0  0.0  0.0  1.0

Объяснено

Вы можете создать новые строки, выполнив:

rows_to_add = 10

new_dates = pd.DatetimeIndex([df.index[-1] + pd.DateOffset(years=y)
                               for y in range(rows_to_add)])

DatetimeIndex(['2014-01-04', '2015-01-04', '2016-01-04', '2017-01-04',
               '2018-01-04', '2019-01-04', '2020-01-04', '2021-01-04',
               '2022-01-04', '2023-01-04'],
              dtype='datetime64[ns]', freq=None)

И затемдобавьте эти даты к исходным датам (сохраняя уникальные даты и отсортировав индекс):

new_index = df.index.union(new_dates).unique().sort_values()

DatetimeIndex(['2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04',
               '2015-01-04', '2016-01-04', '2017-01-04', '2018-01-04',
               '2019-01-04', '2020-01-04', '2021-01-04', '2022-01-04',
               '2023-01-04'],
              dtype='datetime64[ns]', freq=None)

и затем переиндексируйте исходный кадр данных, заполняя новые строки значениями в последней строке:

df.reindex(new_index).ffill()

              A    B    C    D
2014-01-01  1.0  0.0  0.0  0.0
2014-01-02  0.0  1.0  0.0  0.0
2014-01-03  0.0  0.0  1.0  0.0
2014-01-04  0.0  0.0  0.0  1.0
2015-01-04  0.0  0.0  0.0  1.0
2016-01-04  0.0  0.0  0.0  1.0
2017-01-04  0.0  0.0  0.0  1.0
2018-01-04  0.0  0.0  0.0  1.0
2019-01-04  0.0  0.0  0.0  1.0
2020-01-04  0.0  0.0  0.0  1.0
2021-01-04  0.0  0.0  0.0  1.0
2022-01-04  0.0  0.0  0.0  1.0
2023-01-04  0.0  0.0  0.0  1.0
0 голосов
/ 17 октября 2018

Использование:

df[-1:].index
DatetimeIndex(['2014-01-04'], dtype='datetime64[ns]', freq='D')
dates_new = pd.date_range(df[-1:].index.values[0], periods=4, freq = pd.DateOffset(years=1))
#set periods to number of rows you want to add + 1
dates_new
DatetimeIndex(['2014-01-04', '2015-01-04', '2016-01-04', '2017-01-04'], dtype='datetime64[ns]', freq='<DateOffset: years=1>')

    df_new = pd.DataFrame(index=dates_new, columns=['A', 'B', 'C', 'D'])
df_new =  df_new.apply(lambda x: df.loc[pd.datetime(2014, 1, 4)], axis = 1)
df_new
             A  B   C   D
2014-01-04  0.0 0.0 0.0 1.0
2015-01-04  0.0 0.0 0.0 1.0
2016-01-04  0.0 0.0 0.0 1.0
2017-01-04  0.0 0.0 0.0 1.0

df = df.append(df_new)

            A   B   C   D
2014-01-01  1.0 0.0 0.0 0.0
2014-01-02  0.0 1.0 0.0 0.0
2014-01-03  0.0 0.0 1.0 0.0
2014-01-04  0.0 0.0 0.0 1.0
2014-01-04  0.0 0.0 0.0 1.0
2015-01-04  0.0 0.0 0.0 1.0
2016-01-04  0.0 0.0 0.0 1.0
2017-01-04  0.0 0.0 0.0 1.0

Кинда выглядит как хак

Вы можете удалить дубликат индекса, используя:

df = df[~df.index.duplicated(keep='first')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...