Pandas - 在数据框中创建新列时if函数出错

时间:2016-06-19 05:18:43

标签: python pandas

我在df lastseason中有一个列draft类型对象(没有NULL或NaN)。我想根据Age_retired到50的最后两位数字进行比较,创建一个新列lastseason

这是最后一季的专栏

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结构不适用于具有多个值的列。非常感谢任何帮助

1 个答案:

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