2016-11-08 17 views
0

複数の引数を持つ関数を適用してこのデータからパンダシリーズを取得しようとしています。私のコードとデータは、私はパンダシリーズを取得したいと思いますので、私のデータが列「誕生日」にgetage関数を適用した後、この複数の引数を持つカスタム関数をパンダ列に適用すると、UnboundLocalErrorが発生する

Index BirthDate ID Values 
0  25031978 001 5 
1  None  002 10 
3  12122012 003 15 

ように見える

from datetime import datetime 
import pandas as pd 
from dateutil.relativedelta import relativedelta 

def getage(x,now,status): 
    if x != None: 
     date = pd.to_datetime(x,format='%d%m%Y').date() 
     age = relativedelta(now, date).years 
     if status: 
      age = relativedelta(now, date).years 
     else: 
      age = 'Unknown' 
    return age 

today = datetime.now().date() 
data = pd.DataFrame({'ID':['001','002','003'], 
        'BirthDate':['25031978',None,'12122012'], 
        'Values':[5,10,15]}) 
customer_age = df['BirthDate'].apply(getage,args=(today,True,)) 

以下の通りです(customer_age次のように):

Index 0 
0  38  # because the date difference (year) between BirthDate and today is 38 
1  Unknown 
2  4  # because the date difference (year) between BirthDate and today is 4 

をただし、次のように、私はエラーを取得する:

UnboundLocalError: local variable 'age' referenced before assignment 

この問題を解決するためのご提案がありますか?前もって感謝します。

+2

'x'が' None'の場合、 'age'を返そうとしています。 'x'が' None'のとき 'age'とは何ですか? – user2357112

+2

トレースバックに問題があった行が示されました。トレースバックを投稿した場合は、それも見ることができますが、私たちが推測することを望むので、私は推測します。 'UnboundLocalError'は何かを割り当てる前にローカル変数を使用しようとしたことを意味します。あなたのコードを見ると、 'x'が' None'のときの 'return age'で起こります。私がしたのは、エラーのある行から、 'age'を設定するのを怠ったコードパスを振り返ってみるだけでした。その解決策は、その場合に 'age'にある値を代入する' else'節です。 – tdelaney

+0

ありがとうございます。私はUnderboundlocalErrorについてもっとよく理解しており、今修正することができます。 –

答えて

0

user2357112で指摘されているように、xが1の場合、ageの値を設定する必要があります。これは別の条件を追加することで可能です。

+0

ありがとうございます。それは完全に動作します。 –

関連する問題