Python 如何通过特定列指定新的值列?

Python 如何通过特定列指定新的值列?,python,function,pandas,Python,Function,Pandas,我有这样的数据: Id Date 12 2017 12 2016 13 2014 13 2013 14 2017 14 2015 14 2016 Id Date Check 12 2017 On 12 2016 On 13 2014 On 13 2013 On 14 2017 Off 14 2015 Off 14

我有这样的数据:

Id     Date   
12     2017
12     2016
13     2014
13     2013
14     2017
14     2015
14     2016
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列表,如果Id位于“检查列表”中,则应分配一个值“开”,否则分配“关”:

check_list= [12,13]
所以数据应该是这样的:

Id     Date   
12     2017
12     2016
13     2014
13     2013
14     2017
14     2015
14     2016
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

您还可以使用列表理解并将其传递给df,如下所示:

Id     Date   
12     2017
12     2016
13     2014
13     2013
14     2017
14     2015
14     2016
Id      Date    Check
12      2017    On
12      2016    On
13      2014    On
13      2013    On
14      2017    Off
14      2015    Off
14      2016    Off

df['Check']=['On'如果[12,13]中有id,那么df.id中的id就“Off”]

删除
()
只需使用
.apply(Check)
你考虑过使用
.isin
吗?或者
.replace
?我尝试了它,得到了这个错误类型error:check()不带参数(给定1)我不想替换值,只想添加一个新的“开”和“关”列