熊猫:识别范围内值的重叠成员资格

时间:2016-12-03 18:25:10

标签: python pandas

我正在开发一个包含成员资格开始和结束日期的数据集(例如,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) 

我觉得我可能会错过一段时间的声明,但我无法弄明白,我不会惊讶地发现那不是缺失的部分。

数据从这样开始:

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给出了一个很好的答案,只需要几个调整:

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 个答案:

答案 0 :(得分: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