我有这样的数据:
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
不使用 apply 的替代方法是使用 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
关于python - 如何按特定列分配新的值列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867841/