[英]How can I fill missing dates with the last entry in a pandas DataFrame?
假设我有以下数据:
data = [{"id":1,"date":" 1-1-2001","f1":1,"f2":0,"f3":1},{"id":1,"date":" 2-1-2001","f1":2,"f2":1,"f3":1},{"id":1,"date":" 3-1-2001","f1":3,"f2":1,"f3":1},{"id":2,"date":" 1-1-2001","f1":1,"f2":0,"f3":1},{"id":2,"date":" 3-1-2001","f1":3,"f2":2,"f3":1},{"id":3,"date":" 1-1-2001","f1":1,"f2":0,"f3":1},{"id":3,"date":" 2-1-2001","f1":5,"f2":3,"f3":3}]
df = pd.DataFrame(data)
date f1 f2 f3 id
0 1-1-2001 1 0 1 1
1 3-1-2001 2 1 1 1
2 4-1-2001 3 1 1 1
3 1-1-2001 1 0 1 2
4 4-1-2001 3 2 1 2
5 1-1-2001 1 0 1 3
6 3-1-2001 5 3 3 3
在上面的数据中,每一行都应该用“id”标签来标识,但是 id 的 2 和 3 都缺少来自具有 ID 1 条目的日期的条目。有没有一种简单的方法可以创建这些带有其他日期的行ID 有,但是用他们以前的条目填充它们? 所需的输出是:
date f1 f2 f3 id
0 1-1-2001 1 0 1 1
1 3-1-2001 2 1 1 1
2 4-1-2001 3 1 1 1
3 1-1-2001 1 0 1 2
4 3-1-2001 1 0 1 2
5 4-1-2001 3 2 1 2
6 1-1-2001 1 0 1 3
7 3-1-2001 5 3 3 3
8 4-1-2001 5 3 3 3
请记住,我不想为数据集中不存在的日期创建行。 本质上,如果我的“日期”列中已经存在一个日期,我想确保每个 ID 都有该日期对应的一行。 例如,如果 ID 101 具有 1 月 3 日的条目但 ID 103 没有,我想为 ID 103, 1 月 3 日创建一行,其中填充来自其前一个数据点(1 月 2 日)的特征数据,或数据集中的前一个日期)。
我希望我的问题足够清楚。 如果不是,我很乐意在评论中澄清。
您可以使用from_product
方法创建一个pandas.MultiIndex
。
使用它来重新索引您的DataFrame
然后使用DataFrame.ffill
填充 NaN 值。
idx = pd.MultiIndex.from_product([df['date'].unique(), df['id'].unique()],
names=['date', 'id'])
df_fixed = df.set_index(['date', 'id']).reindex(idx).reset_index().sort_values('id').ffill()
df_fixed = df_fixed.loc[:, df.columns].astype(df.dtypes)
[出去]
date f1 f2 f3 id
0 1-1-2001 1 0 1 1
3 3-1-2001 2 1 1 1
6 4-1-2001 3 1 1 1
1 1-1-2001 1 0 1 2
4 3-1-2001 1 0 1 2
7 4-1-2001 3 2 1 2
2 1-1-2001 1 0 1 3
5 3-1-2001 5 3 3 3
8 4-1-2001 5 3 3 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.