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