我有这样的数据:

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.isinnumpy.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

10-05 18:00
查看更多