2016-12-03 45 views
1

我正在處理包括成員資格開始和結束日期(例如,2003年12月3日和2007年10月23日)的數據集,並且我試圖隔離每年的成員資格在上面的例子中,我會尋找2003年,2004年,2005年,2006年,2007年)。熊貓:識別範圍內的值的重疊成員資格

現在我的代碼只會在第一年確定會員資格,這是沒有用的,因爲我可以通過查看加入年份來獲得這一點。

year_list = [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009] 

for year in year_list: 

    mem_year_list = [] 

    for x in dfy.join_year: 
     if x >= year | x < (year+1): 
      mem_year_list.append(1) 
     else: 
      mem_year_list.append(0) 

我覺得我可能會丟失while語句,但我一直沒能弄明白,我也不會感到驚訝地發現,這是不缺少的部分。

數據像這樣開頭:

mem_no status animal join_year exp_year   
00004 Active Lark 12-2-02 10-23-07   
00101 Expired Parrot 4-1-03  2-1-16  
00118 Crunchy Frog 10-8-01 2-22-02  
00121 Grumpy Panda 5-1-03  3-1-04  

,並最終看起來像這樣:

mem_no status animal join_year exp_year mem_02 mem_03 mem_04 mem_05  
00004 Active Lark 12-2-02 10-23-07 1 0  0  0   
00101 Expired Parrot 4-1-03  2-1-16 0 1  0  0  
00118 Crunchy Frog 10-8-01 2-22-02 1 0  0  0  
00121 Grumpy Panda 5-1-03  3-1-04 0 1  0  0 

,但我想它最終會是這樣的:

mem_no status animal join_year exp_year mem_02 mem_03 mem_04 mem_05  
00004 Active Lark 12-2-02 10-23-07 1 1  1  1   
00101 Expired Parrot 4-1-03  2-1-16 0 1  1  1  
00118 Crunchy Frog 10-8-01 2-22-02 1 0  0  0  
00121 Grumpy Panda 5-1-03  3-1-04 0 1  1  0 

Roman給出了一個很好的答案,只需要幾個t weaks:

dfy['joined'] = pd.to_datetime(dfy['joined']) 
dfy['exp_date'] = pd.to_datetime(dfy['exp_date']) 

year_list = [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,\ 
      2012, 2013, 2014, 2015] 

for year in year_list: 
# code to isolate prior years 

    dfy['mem_' + str(year)] = dfy.apply(lambda x: x['joined'].year\ 
     <= year and x['exp_date'].year>= year, axis=1).astype('int') 

# code to isolate current year 

dfy['mem_2016'] = dfy.apply(lambda x: x['exp_date'].year\ 
     <= 2016, axis=1).astype('int') 

回答

1
>>> for year in year_list: 
...  dfy['mem_' + str(year)] = dfy.apply(lambda x: x['join'].year <= year and x['end'].year >= year, axis=1).astype('int') 
>>> dfy 
    mem_no status animal  join  end mem_2002 mem_2003 mem_2004 mem_2005 mem_2006 mem_2007 mem_2008 mem_2009 
0  4 Active Lark 2002-12-02 2007-10-23   1   1   1   1   1   1   0   0 
1  101 Expired Parrot 2003-04-01 2016-02-01   0   1   1   1   1   1   1   1 
2  118 Crunchy Frog 2001-10-08 2002-02-22   1   0   0   0   0   0   0   0 
3  121 Grumpy Panda 2003-05-01 2004-03-01   0   1   1   0   0   0   0   0 
+0

感謝您發送此建議。不幸的是,它返回的AttributeError:(「'int'對象沒有屬性'年'','發生在索引0') – ajbentley

+0

好吧,它看起來像你的'join'和'end'列不是日期你問我 :) )。所以你可以用'df ['join'] = pd.to_datetime(df ['join'])' –

+0

將其轉換爲實際名稱join_year和exp_year,fwiw,但我會嘗試轉換爲dt。 – ajbentley

0

你可以先找到列joinend之間的所有值與頻率A( '年')和pivot的重塑:

df1=pd.concat([pd.Series(r.Index, 
         pd.date_range(r.join,r.end+pd.offsets.YearEnd(1), freq='A')) 
       for r in df.itertuples()]).reset_index() 
df1.columns=[ 'years', 'index'] 
df1.years = df1.years.dt.year 
df1['vals'] = 1 
df1 = df1.pivot(index='index', columns='years', values='vals').fillna(0).astype(int) 
print (df1) 
years 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 \ 
index                   
0   0  1  1  1  1  1  1  0  0  0  0  0 
1   0  0  1  1  1  1  1  1  1  1  1  1 
2   1  1  0  0  0  0  0  0  0  0  0  0 
3   0  0  1  1  0  0  0  0  0  0  0  0 

years 2013 2014 2015 2016 
index       
0   0  0  0  0 
1   1  1  1  1 
2   0  0  0  0 
3   0  0  0  0 

然後,通過多年的篩選列,add_prefixconcat原來的DataFrame

year_list = [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009] 

df2 = pd.concat([df, 
       df1[year_list].rename(columns=lambda x: str(x)[2:]).add_prefix('mem_')], 
       axis=1) 
print (df2) 
    mem_no status animal  join  end mem_02 mem_03 mem_04 \ 
0 00004 Active Lark 2002-12-02 2007-10-23  1  1  1 
1 00101 Expired Parrot 2003-04-01 2016-02-01  0  1  1 
2 00118 Crunchy Frog 2001-10-08 2002-02-22  1  0  0 
3 00121 Grumpy Panda 2003-05-01 2004-03-01  0  1  1 

    mem_05 mem_06 mem_07 mem_08 mem_09 
0  1  1  1  0  0 
1  1  1  1  1  1 
2  0  0  0  0  0 
3  0  0  0  0  0 
+0

謝謝你。不幸的是,我收到了一些很奇怪的東西,AttributeError:'int'對象沒有'month'屬性(真的很奇怪,因爲你的代碼和我的數據都沒有「月」)。 – ajbentley

+0

首先你需要通過'df ['join'] = pd.to_datetime(df ['join'])''和'df ['end'] = pd.to_datetime(df ['end' ])'那麼我的解決方案完美。 – jezrael