想象一下,我有一个数据帧,看起来像:
ID DATE VALUE_1 Value_2 ...
1 31-01-2006 5 "USD"
1 31-01-2007 5 "USD"
1 31-01-2008 10 "USD"
1 31-01-2011 11 "USD"
2 31-12-2006 5 "USD"
2 31-12-2007 5 "USD"
2 31-12-2008 5 "USD"
2 31-12-2009 5 "USD"
随着X更多的列。
正如你可以看到这是与同日不同的ID多个条目面板数据。我想要做的是填补丢失的每个ID的日期。你可以看到,ID为“1”出现在第二和第三项之间个月的跳跃。
我想一个数据帧,看起来像下面的一个 - 请记住,我要寻找与许多价值列+30和许多的ID(1000+)为dataframes有效的解决方案,仍然是有效的。即不应该有任何的数据填充的ID的那些已经“完成”,意思是,他们已经有一个频率,由数据指定。在这种情况下,每年的频率。但请记住,即使他们有一个年度的频率,他们并不总是遵循日历年。
ID DATE VALUE_1 Value_2 ...
1 31-01-2006 5 "USD"
1 31-01-2007 5 "USD"
1 31-01-2008 10 "USD"
1 31-01-2009 NA NA
1 31-01-2010 NA NA
1 31-01-2011 11 "USD"
2 31-12-2006 5 "USD"
2 31-12-2007 5 "USD"
2 31-12-2008 5 "USD"
2 31-12-2009 5 "USD"
这里是一个完全灵活的解决方案:
def resample_custom_freq(data):
""" Resample datetime using different time offsets """
# Compute the offsets
month = data['Month'][0] - 1
day = data['Day'][0] - 1
# Modify data
data = data.resample('AS').last().drop('ID', axis=1).reset_index().reset_index()
data.loc[:, 'DATE'] += pd.offsets.MonthOffset(month)
data.loc[:, 'DATE'] += pd.offsets.DateOffset(day)
return data
df['DATE'] = pd.to_datetime(df['DATE'])
df['Month'] = df['DATE'].dt.month
df['Day'] = df['DATE'].dt.day
df.set_index('DATE', inplace=True, drop=True)
df_1 = df.groupby('ID').apply(resample_custom_freq).reset_index().drop(['level_1', 'index', 'Month', 'Day'], axis=1)
df_1
Out[264]:
ID DATE VALUE_1 Value_2
0 1 2006-01-31 5.0 "USD"
1 1 2007-01-31 5.0 "USD"
2 1 2008-01-31 10.0 "USD"
3 1 2009-01-31 NaN NaN
4 1 2010-01-31 NaN NaN
5 1 2011-01-31 11.0 "USD"
6 2 2006-12-31 5.0 "USD"
7 2 2007-12-31 5.0 "USD"
8 2 2008-12-31 5.0 "USD"
9 2 2009-12-31 5.0 "USD