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)我不想替换值,只想添加一个新的“开”和“关”列