如何用熊猫DataFrame中的最后一个条目填充缺少的日期?

时间:2019-03-09 14:42:02

标签: python pandas

假设我有以下数据:

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为1的日期开始,id的2和3都将丢失。是否可以通过以下简单方法创建这些行:日期,其他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日)的要素数据填充,或数据集中的先前日期是什么。)

我希望我的问题足够清楚。如果没有,我很乐意在评论中澄清。

1 个答案:

答案 0 :(得分:1)

您可以使用pandas.MultiIndex方法创建一个from_product

使用此方法为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