2017-09-04 68 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' 我不想...... –