Как заполнить пропущенные даты нулями для группового списка панд? - PullRequest
2 голосов
/ 18 июня 2019

Я хочу вести ежедневную запись транзакций и учетную запись за дни, когда произошло 0 транзакций.

Вот мой начальный кадр данных:

df.head()
tr_timestamp  text      location
2016-01-01    cookies   TX
2016-01-01    pizza     TX
2016-01-04    apples    TX
2016-01-08    bread     TX

Когда я запускаю группу по дням, Я получаю следующее:

df_by_day = df['tr_timestamp'].groupby(df.tr_timestamp).count()
df_by_day

tr_timestamp
2016-01-01  2
2016-01-04  1
2016-01-08  1

Я ищу использовать Python / Pandas, где даты без транзакции заполняются так, что я получаю следующий вывод:

df_by_day_filled

tr_timestamp
2016-01-01  2
2016-01-02  0
2016-01-03  0
2016-01-04  1
2016-01-05  0
2016-01-06  0
2016-01-07  0
2016-01-08  1

I 'мы попробовали следующие ответы, которые не совсем дают результат, который мне нужен:

Pandas groupby для нулевых значений

Заполнить недостающие даты в DataFrame с помощьюДублирующиеся даты в Groupby

Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Вы также можете попробовать:

df_by_day.asfreq('D', fill_value=0)

Выход:

tr_timestamp
2016-01-01    2
2016-01-02    0
2016-01-03    0
2016-01-04    1
2016-01-05    0
2016-01-06    0
2016-01-07    0
2016-01-08    1
Freq: D, Name: tr_timestamp, dtype: int64
1 голос
/ 18 июня 2019

Это операция resample:

df.set_index(pd.to_datetime(df.pop('tr_timestamp'))).resample('D')['text'].count()

tr_timestamp
2016-01-01    2
2016-01-02    0
2016-01-03    0
2016-01-04    1
2016-01-05    0
2016-01-06    0
2016-01-07    0
2016-01-08    1
Freq: D, Name: text, dtype: int64

Вызов pd.to_datetime гарантирует, что это работает, если "tr_timestamp" не является datetime. Если это так, то решение упрощается до

df.dtypes

tr_timestamp    datetime64[ns]
text                    object
location                object
dtype: object

df.set_index('tr_timestamp').resample('D')['text'].count()

tr_timestamp
2016-01-01    2
2016-01-02    0
2016-01-03    0
2016-01-04    1
2016-01-05    0
2016-01-06    0
2016-01-07    0
2016-01-08    1
Freq: D, Name: text, dtype: int64
...