假设我有以下数据:
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日)的要素数据填充,或数据集中的先前日期是什么。)
我希望我的问题足够清楚。如果没有,我很乐意在评论中澄清。
答案 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