我有这样的数据:
Id Date
12 2017
12 2016
13 2014
13 2013
14 2017
14 2015
14 2016
此外我还有一个ID列表,如果Id在'check_list'中,则应指定值'On',否则指定'Off':
check_list= [12,13]
所以数据应该是这样的:
Id Date Check
12 2017 On
12 2016 On
13 2014 On
13 2013 On
14 2017 Off
14 2015 Off
14 2016 Off
代码
我试图定义一个函数,但我不知道它为什么只返回id,这里是代码:
def check():
if df['Id'] in check_list:
return 'On'
else:
return 'Off'
f['Check'] = df['Id'].apply(check())
答案 0 :(得分:4)
您尝试.apply
的功能是错误的,而且,您没有通过该功能,您正在调用该函数并传递结果:
所以,你可以这样做:
In [20]: def check(x):
...: if x in check_list:
...: return 'On'
...: else:
...: return 'Off'
...:
In [21]: df['Id'].apply(check)
Out[21]:
0 On
1 On
2 On
3 On
4 Off
5 Off
6 Off
Name: Id, dtype: object
不适用的替代方法是使用pd.Series.isin
和numpy.where
,因此,给定:
In [23]: df
Out[23]:
Id Date
0 12 2017
1 12 2016
2 13 2014
3 13 2013
4 14 2017
5 14 2015
6 14 2016
In [24]: check_list = [12, 13]
您可以使用isin
:
In [25]: df['Id'].isin(check_list)
Out[25]:
0 True
1 True
2 True
3 True
4 False
5 False
6 False
Name: Id, dtype: bool
所以,比如:
In [26]: df['Check'] = np.where(df['Id'].isin(check_list), 'On', 'Off')
In [27]: df
Out[27]:
Id Date Check
0 12 2017 On
1 12 2016 On
2 13 2014 On
3 13 2013 On
4 14 2017 Off
5 14 2015 Off
6 14 2016 Off
您也可以使用pd.Series.map
:
mapping = dict.fromkeys(check_list, 'On')
df['Check'] = df['Id'].map(mapping).fillna('Off')
df
Id Date Check
0 12 2017 On
1 12 2016 On
2 13 2014 On
3 13 2013 On
4 14 2017 Off
5 14 2015 Off
6 14 2016 Off
答案 1 :(得分:1)
您也可以使用列表理解并将其传递给df,如下所示:
df['Check'] = ['On' if id in [12,13] else 'Off' for id in df.id]