2016-06-19 51 views
0

我在df draft中有一列lastseason類型對象(無NULL或NaN)。我想創建一個基於的最後2個位數的lastseason比較新列Age_retired到50熊貓 - 在數據框中創建新列時if函數出錯

這裏是上賽季列

0  1993-94 
1  1990-91 
2  1993-94 
3  1997-98 
Name: lastseason, dtype: object 

提取的最後2位數字,並轉換爲數字

print pd.to_numeric(draft['lastseason'].astype('str').str[-2:],errors='coerce') 
0  94 
1  91 
2  94 
3  98 
Name: lastseason, dtype: int64 

創建列Age_retired

if pd.to_numeric(draft['lastseason'].astype('str').str[-2:],errors='coerce') <50: 
draft['Age_retired'] = 2000 + pd.to_numeric(draft['lastseason'].astype('str').str[-2:],errors='coerce') 
else: 
draft['Age_retired'] = 1900 + pd.to_numeric(draft['lastseason'].astype('str').str[-2:],errors='coerce') 

我與if行錯誤:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我在想,我的if-else結構不適用於列有許多價值。真的很感謝任何幫助

回答

2

是的,if-else構造不會以元素方式進行評估。但是,使用按元素應用函數的系列.map方法很容易解決這個問題。首先定義函數,然後映射它。您可以簡單地將映射的結果分配到draft['age_retired']以創建新列。

In [10]: def add_age_retired(x): 
      if x < 50: 
       return 2000 + x 
      else: 
       return 1900 + x 


In [11]: pd.to_numeric(draft['lastseason'].astype('str').str[-2:],errors='coerce').map(add_age_retired) 
Out[11]: 
0 1994 
1 1991 
2 1994 
3 1998 
Name: lastseason, dtype: int64 

In [12]: draft['Age_retired'] = pd.to_numeric(draft['lastseason'].astype('str').str[-2:],errors='coerce').map(add_age_retired) 

In [13]: draft 
Out[13]: 
    lastseason Age_retired 
0 1993-94   1994 
1 1990-91   1991 
2 1993-94   1994 
3 1997-98   1998 
+0

謝謝@ juanpa.arrivillaga。只是好奇,有沒有定義一個新的功能做同樣的事情呢? – Square9627

+0

@ Square9627如果您不想定義新函數,則可以使用lambda函數: '... map(lambda x:2000 + x if <50 else 1900 + x)' –

相關問題