我有这样的数据:
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())
最佳答案
您试图.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