如何在大熊猫分组之后补充缺少分组的日期?

时间:2019-04-23 14:57:55

标签: python pandas

我的目标是在project_id行中用0补充每个data的缺失日期条目。

例如

df = pd.DataFrame({
    'project_id': ['A', 'A', 'A', 'B', 'B'], 
    'timestamp': ['2018-01-01', '2018-03-01', '2018-04-01', '2018-03-01', '2018-06-01'], 
    'data': [100, 28, 45, 64, 55]})

  project_id   timestamp  data
0          A  2018-01-01   100
1          A  2018-03-01    28
2          A  2018-04-01    45
3          B  2018-03-01    64
4          B  2018-06-01    55

应成为

  project_id   timestamp  data
0          A  2018-01-01   100
1          A  2018-02-01     0
2          A  2018-03-01    28
3          A  2018-04-01    45
4          B  2018-03-01    64
5          B  2018-04-01     0
6          B  2018-05-01     0
7          B  2018-06-01    55

其中添加了索引1、5和6。

我当前的方法:

df.groupby('project_id').apply(lambda x: x[['timestamp', 'data']].set_index('timestamp').asfreq('M', how='start', fill_value=0))

显然是错误的,因为它将所有内容都设置为0并重新采样不是一个月的第一个日期,而是最后一个-尽管我认为这应该由how处理。

如何在datetime之后扩展/补充丢失的groupby条目,以获得每个组的连续时间序列?

2 个答案:

答案 0 :(得分:3)

You are close:

df.timestamp = pd.to_datetime(df.timestamp)

# notice 'MS'
new_df = df.groupby('project_id').apply(lambda x: x[['timestamp', 'data']]
                                                    .set_index('timestamp').asfreq('MS'))

new_df.data = df.set_index(['project_id', 'timestamp']).data
df = new_df.fillna(0).reset_index()

答案 1 :(得分:2)

You can use groupby in combination with pandas.Grouper:

df_new = pd.concat([
    d for n, d in df.set_index('timestamp').groupby(pd.Grouper(freq='MS'))
])

df_new = df_new.sort_values('project_id').reset_index()

Output

print(df_new)
   timestamp project_id   data
0 2018-01-01          A  100.0
1 2018-02-01          A    0.0
2 2018-03-01          A   28.0
3 2018-04-01          A   45.0
4 2018-03-01          B   64.0
5 2018-04-01          B    0.0
6 2018-05-01          B    0.0
7 2018-06-01          B   55.0