Python 填写分组 ID 的缺失日期,其中每个 ID 都有自己的最小和最大日期

Python Fill in missing dates for grouped IDs, where each ID has it's own min and max date

嘿,我看到很多问题的答案都是最大和最小日期在输出中保持不变。但是如何为每个 ID 填写日期,您只需要在每个 ID 的最大和最小日期之间填写什么。 例如说这是数据框

x = pandas.DataFrame({'user': ['a','a','b','b','a' ], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-09','2016-01-06'], 'val': [1,33,2,1,2]})

期望的输出是

日期 用户
2016-01-01 一个 1.0
2016-01-02 一个 33.0
2016-01-03 一个 0.0
2016-01-04 一个 0.0
2016-01-05 一个 0.0
2016-01-06 一个 2.0
2016-01-05 b 2.0
2016-01-06 b 0.0
2016-01-07 b 0.0
2016-01-08 b 0.0
2016-01-09 b 1.0

目前正在使用此代码

udates=x['dt'].unique()
x['dt'] = pandas.to_datetime(x['dt'])


filled_df = (x.set_index('dt')
         .groupby('user')
         .apply(lambda d: d.reindex(pd.date_range(min(x.dt),
                                                  max(x.dt),
                                                  freq='D')))
         .drop('user', axis=1)
         .reset_index('user')
         .fillna(0)) 

B 的当前输出回填日期早于其最小日期

日期 用户
2016-01-01 一个 1.0
2016-01-02 一个 33.0
2016-01-03 一个 0.0
2016-01-04 一个 0.0
2016-01-05 一个 0.0
2016-01-06 一个 2.0
2016-01-01 b 0.0
2016-01-02 b 0.0
2016-01-03 b 0.0
2016-01-04 b 0.0
2016-01-05 b 2.0
2016-01-06 b 0.0
2016-01-07 b 0.0
2016-01-08 b 0.0
2016-01-09 b 1.0

非常感谢帮助!!!

基于您的解决方案,我只是将 min(x.dt) 替换为 min(d.index):

import pandas as pd
x = pd.DataFrame({'user': ['a','a','b','b','a'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-09','2016-01-06'], 'val': [1,33,2,1,2]})
x['dt'] = pd.to_datetime(x['dt'])


filled_df = (x.set_index('dt')
         .groupby('user')
         .apply(lambda d: d.reindex(pd.date_range(min(d.index),
                                                  max(x.dt),
                                                  freq='D')))
         .drop('user', axis=1)
         .reset_index('user')
         .fillna(0))

输出

>>> filled_df
           user   val
2016-01-01    a   1.0
2016-01-02    a  33.0
2016-01-03    a   0.0
2016-01-04    a   0.0
2016-01-05    a   0.0
2016-01-06    a   2.0
2016-01-07    a   0.0
2016-01-08    a   0.0
2016-01-09    a   0.0
2016-01-05    b   2.0
2016-01-06    b   0.0
2016-01-07    b   0.0
2016-01-08    b   0.0
2016-01-09    b   1.0