2016-12-03 2 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 

ローマは素晴らしい答えを出しました。 weaks:あなたが最初のリシェイプ用の周波数A( '年')とpivotで列joinend間のすべての値を見つけることができます

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'オブジェクトは属性 'year'"を持たず、インデックス0にu'occurredされています) – ajbentley

+0

'join'と' end'カラムは日付ではありません(ifあなたは私に尋ねる:))。 'df ['join'] = pd.to_datetime(df ['join'])' –

+0

実際の名前はjoin_yearとexp_year、fwiwですが、dtに変換しようとします。 – ajbentley

0

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_prefixそしてconcatからオリジナル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'オブジェクトの属性は '月'(本当に奇妙なので、あなたのコードも自分のデータにも '月'がありません。 – ajbentley

+0

最初に、 'df ['join'] = pd.to_datetime(df ['join'])'と 'df ['end'] = pd.to_datetime(df ['end' ]) '私のソリューションは完璧に動作します。 – jezrael

関連する問題