我有一个日期列表和一个数据框。现在,数据框具有一个id列和其他对于所有日期都不一致的值。我想在没有数据的id和日期的所有列中填充零。让我通过示例向您展示:
date id clicks conv rev
2019-01-21 234 34 1 10
2019-01-21 235 32 0 0
2019-01-24 234 56 2 20
2019-01-23 235 23 3 30
日期列表如下:
[2019-01-01, 2019-01-02,2019-01-03 ....2019-02-28]
我想要的是为所有ID的数据框中的所有缺失日期添加零。因此,生成的df应该如下所示:
date id clicks conv rev
2019-01-01 234 0 0 0
2019-01-01 235 0 0 0
. . . .
. . . .
2019-01-21 234 34 1 10
2019-01-21 235 32 0 0
2019-01-22 234 0 0 0
2019-01-22 235 0 0 0
2019-01-23 234 0 0 0
2019-01-23 235 0 0 0
2019-01-24 234 56 2 20
2019-01-23 235 23 3 30
. . . .
2019-02-28 0 0 0 0
答案 0 :(得分:2)
将DataFrame.reindex
与MultiIndex
一起使用,也有必要将list
和列date
转换为datetime
s:
dates = ['2019-01-01', '2019-01-21','2019-01-22','2019-01-23', '2019-01-24']
mux = pd.MultiIndex.from_product([pd.DatetimeIndex(dates),
df['id'].unique()], names=['date','id'])
df['date'] = pd.to_datetime(df['date'])
df = df.set_index(['date','id']).reindex(mux, fill_value=0).reset_index()
print (df)
date id clicks conv rev
0 2019-01-01 234 0 0 0
1 2019-01-01 235 0 0 0
2 2019-01-21 234 34 1 10
3 2019-01-21 235 32 0 0
4 2019-01-22 234 0 0 0
5 2019-01-22 235 0 0 0
6 2019-01-23 234 0 0 0
7 2019-01-23 235 23 3 30
8 2019-01-24 234 56 2 20
9 2019-01-24 235 0 0 0
验证dtypes
print (df['date'].dtype)
datetime64[ns]
print (mux.levels[0].dtype)
datetime64[ns]