如何通过特定列分配新的值列?

时间:2017-10-21 20:39:10

标签: python function pandas

我有这样的数据:

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()) 

2 个答案:

答案 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.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

答案 1 :(得分:1)

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

df['Check'] = ['On' if id in [12,13] else 'Off' for id in df.id]