缺少的日期填写GROUPBY与多个列定义的频率

问题描述 投票:2回答:1

想象一下,我有一个数据帧,看起来像:

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"
python pandas pandas-groupby
1个回答
1
投票

这里是一个完全灵活的解决方案:

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
© www.soinside.com 2019 - 2024. All rights reserved.