2017-09-04 59 views
0

我有一个数据帧,看起来像这样:的Python:填写缺少的日期为每个组

x = pd.DataFrame({'user': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b','b'], 'rd': ['2016-01-01', '2016-01-01' , 
         '2016-02-01', '2016-02-01', '2016-02-01', '2016-05-01', '2016-05-01', 
          '2016-06-01','2016-06-01', '2016-06-01'], 
        'fd' : ['2016-02-01', '2016-04-01', '2016-03-01', '2016-04-01', '2016-05-01', 
         '2016-06-01', '2016-07-01', '2016-08-01', '2016-07-01', '2016-09-01'], 
        'val': [3, 4, 16, 7, 9, 2, 5, 11, 20, 1]}) 

x.head(6) 

     fd   rd  user val 
0 2016-02-01 2016-01-01 a 3 
1 2016-04-01 2016-01-01 a 4 
2 2016-03-01 2016-02-01 a 16 
3 2016-04-01 2016-02-01 a 7 
4 2016-05-01 2016-02-01 a 9 
5 2016-06-01 2016-05-01 b 2 

x['rd'] = pd.to_datetime(x['rd']) 
x['fd'] = pd.to_datetime(x['fd']) 

因为我想有未来3节月的日期各次日期。例如:

rd = 2016-01-01 

我想有:

fd = [2016-02-01, 2016-03-01, 2016-04-01] 

基本上是:每个RD日期我想在未来3个月FD日期。 在我的数据集中,我在012d和fd中都有缺失的日期,只要我有第(rd = 2016-01-01, fd missing = 2016-03-01)日期。

此外,我有2个不同的用户x['user'].unique() = ['a', 'b']。 因此,我可能在一个用户中,在另一个用户中或两者中缺少日期(包括'rd'和'fd')。

我想实现的是一个有效的方式来获取所有用户的所有日期的数据帧。

这个问题从已经回答的一个Question开始,但这里的问题稍微复杂一点,因为我无法使Multiindex适合手头的问题。

我所做的一切,直至现在是创建日期的2列:

index = pd.date_range(x['rd'].min(), 
          x['rd'].max(), freq='MS') 

from datetime import datetime 
from dateutil.relativedelta import relativedelta 
def add_months(date): 
    fcs_dates = [date + relativedelta(months = 1), date + relativedelta(months = 2), date + relativedelta(months = 3)] 
    return fcs_dates 

fcs_dates = list(map(lambda x: add_months(x), index.tolist())) 
fcs_dates = [j for i in fcs_dates for j in i] 
index3 = index.tolist()*3 
index3.sort() 

所以输出:

list(zip(index3, fcs_dates))[:5] 

[(Timestamp('2016-01-01 00:00:00', freq='MS'), 
    Timestamp('2016-02-01 00:00:00', freq='MS')), 
(Timestamp('2016-01-01 00:00:00', freq='MS'), 
    Timestamp('2016-03-01 00:00:00', freq='MS')), 
(Timestamp('2016-01-01 00:00:00', freq='MS'), 
    Timestamp('2016-04-01 00:00:00', freq='MS')), 
(Timestamp('2016-02-01 00:00:00', freq='MS'), 
    Timestamp('2016-03-01 00:00:00', freq='MS')), 
(Timestamp('2016-02-01 00:00:00', freq='MS'), 
    Timestamp('2016-04-01 00:00:00', freq='MS'))] 

不幸的是我不知道如何堵塞这为多指标函数线索。

谢谢您的帮助

回答

0

因此,我通过对每个组(用户)进行左连接来解决自己的问题,其中左边的数据框是用日期构造的。

pd.DataFrame与日期:

left_df = pd.DataFrame({'rd' : index_3, 'fd' : fcs_dates}) 
left_df['rd'] = left_df['rd'].astype(str) 
left_df['fd'] = left_df['fd'].astype(str) 

通过用户数据帧进行分组:

df_gr = x.groupby(['user']) 
list_gr = [] 
for i, gr in df_gr: 
    gr_new = pd.merge(left_df, gr, left_on= ['rd', 'fd'], 
           right_on = ['rd', 'fd'], 
          how = 'left') 
    list_gr.append(gr_new) 

df_final = pd.concat(list_gr)  

最终数据框:

fd rd user val 

0 2016-02-01 2016-01-01 a 3.0 
1 2016-03-01 2016-01-01 NaN NaN 
2 2016-04-01 2016-01-01 a 4.0 
3 2016-03-01 2016-02-01 a 16.0 
4 2016-04-01 2016-02-01 a 7.0 
5 2016-05-01 2016-02-01 a 9.0 
6 2016-04-01 2016-03-01 NaN NaN 
7 2016-05-01 2016-03-01 NaN NaN 
8 2016-06-01 2016-03-01 NaN NaN 
9 2016-05-01 2016-04-01 NaN NaN 
10 2016-06-01 2016-04-01 NaN NaN 
11 2016-07-01 2016-04-01 NaN NaN 
12 2016-06-01 2016-05-01 NaN NaN 
13 2016-07-01 2016-05-01 NaN NaN 
14 2016-08-01 2016-05-01 NaN NaN 
15 2016-07-01 2016-06-01 NaN NaN 
16 2016-08-01 2016-06-01 NaN NaN 
17 2016-09-01 2016-06-01 NaN NaN 
0 2016-02-01 2016-01-01 NaN NaN 
1 2016-03-01 2016-01-01 NaN NaN 
2 2016-04-01 2016-01-01 NaN NaN 
3 2016-03-01 2016-02-01 NaN NaN 
4 2016-04-01 2016-02-01 NaN NaN 
5 2016-05-01 2016-02-01 NaN NaN 
6 2016-04-01 2016-03-01 NaN NaN 
7 2016-05-01 2016-03-01 NaN NaN 
8 2016-06-01 2016-03-01 NaN NaN 
9 2016-05-01 2016-04-01 NaN NaN 
10 2016-06-01 2016-04-01 NaN NaN 
11 2016-07-01 2016-04-01 NaN NaN 
12 2016-06-01 2016-05-01 b 2.0 
13 2016-07-01 2016-05-01 b 5.0 
14 2016-08-01 2016-05-01 NaN NaN 
15 2016-07-01 2016-06-01 b 20.0 
16 2016-08-01 2016-06-01 b 11.0 
17 2016-09-01 2016-06-01 b 1.0 

不幸的是,我不认为这是最快的方法,但我得到了我想要的。

1

我遇到了很多麻烦了解你的问题,我不能让INDEX3在Python工作3

您是否在寻找东西沿着这些路线?

indx = pd.MultiIndex.from_product([['a', 'b'], [index], [pd.DatetimeIndex(fcs_dates)]]) 

如果你能够构建在您的多指标所需的水平,from_product需要它们的笛卡尔乘积来创建索引。

+0

谢谢你,我编辑的日期转换datetime的问题..它应该工作。 可惜这不是我要找的:做索引和fcs_dates之间的多产品给我也行这样的: 'RD = 2017-01-01' 'FD = 2017-07-01' 我不想...... –