Ведущие и конечные даты заполнения в Pandas DataFrame - PullRequest
0 голосов
/ 23 марта 2019

Это мой фрейм данных:


df = pd.DataFrame.from_records(data=data, coerce_float=False, index=['date'])
# date field a datetime.datetime values

            account_id  amount
date                          
2018-01-01           1   100.0
2018-01-01           1    50.0
2018-06-01           1   200.0
2018-07-01           2   100.0
2018-10-01           2   200.0

Описание проблемы

Как я могу "дополнить" мой фрейм данных начальными и конечными "пустыми датами".Я попытался переиндексировать date_range и period_range, я попытался объединить другой индекс.Я пробовал все виды вещей весь день, и я прочитал много документов.

У меня есть простой кадр данных со столбцами transaction_date, transaction_amount и transaction_account.Я хочу сгруппировать этот фрейм данных так, чтобы он группировался по учетным записям на первом уровне, а затем по годам, а затем по месяцам.Затем я хочу столбец для каждого месяца с sum от суммы транзакции за этот месяц.

Кажется, что это должно быть что-то, что легко сделать.

ОжидаетсяВывод

Это самое близкое, что я получил:


df = pd.DataFrame.from_records(data=data, coerce_float=False, index=['date'])
df = df.groupby(['account_id', df.index.year, df.index.month])
df = df.resample('M').sum().fillna(0)

print(df)
                                                          account_id  amount
account_id date   date       date                          
1                 2018       1       2018-01-31           2   150.0
                             6       2018-06-30           1   200.0
2                 2018       7       2018-07-31           2   100.0
                            10       2018-10-31           2   200.0

И это то, чего я хочу достичь (в основном, переиндексировать данные с помощью date_range(start='2018-01-01', period=12, freq='M')

(В идеале я хотел бы, чтобы месяц был перенесен на год по верху в виде столбцов)

                                            amount
account_id        Year        Month
1                 2018           1        150.0
                                 2         NaN
                                 3         NaN
                                 4         NaN
                                 5         NaN
                                 6        200.0
                                 ....
                                 12      200.0
2                 2018           1          NaN
                                 ....
                                 7        100.0
                                 ....
                                 10        200.0
                                 ....
                                 12        NaN

1 Ответ

1 голос
/ 23 марта 2019

Один путь к reindex

s=df.groupby([df['account_id'],df.index.year,df.index.month]).sum()
idx=pd.MultiIndex.from_product([s.index.levels[0],s.index.levels[1],list(range(1,13))])
s=s.reindex(idx)
s
Out[287]: 
           amount
1 2018 1    150.0
       2      NaN
       3      NaN
       4      NaN
       5      NaN
       6    200.0
       7      NaN
       8      NaN
       9      NaN
       10     NaN
       11     NaN
       12     NaN
2 2018 1      NaN
       2      NaN
       3      NaN
       4      NaN
       5      NaN
       6      NaN
       7    100.0
       8      NaN
       9      NaN
       10   200.0
       11     NaN
       12     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...