2017-03-15 15 views
-1

我试图做下面的代码:使用df.loc []和在

df.loc[df['Column'] in list]=1 
df.loc[df['Column'] not in list]=2 

但我有著名的错误

一个系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

因此,从我了解的这个错误我已经得到,它是与逻辑链接。我想知道的是有没有一个特定的错字来做我想要做的事情,或者我需要扩展我的整个列表(在我的情况下这将是相当丑陋和长):

df.loc[df[('Column']=='a') & (df['Column']=='b')]=1 
df.loc[df[('Column']!='a') & (df['Column']!='b')]=2 

回答

2

我会用np.where。但是,您需要列名称。

df['new_column'] = np.where(df['Column'].isin(lst), 1, 2) 

考虑名单lst和数据帧df

lst = [1, 2, 3] 
df = pd.DataFrame(dict(Column=[0, 1, 2, 3, 4])) 

然后

df['new_column'] = np.where(df['Column'].isin(lst), 1, 2) 

print(df) 

    Column new_column 
0  0   2 
1  1   1 
2  2   1 
3  3   1 
4  4   2 
+0

所以错字较短,表现如何?因为我正在做一个140k行这些操作很多df –

+0

@Mayeulsgc相对于什么性能?你所选择的答案甚至不是一个完整的答案。但是,'np.where'通常非常快。如果我有一个可行的替代解决方案,我会告诉你一个适当的比较。此外,未来的读者选择解决问题的答案更有益。 – piRSquared

+0

我到目前为止选择的解决方案正在为我工​​作,基于性能时间 –

1

你正在寻找的功能是

df.loc[df['Column'].isin(list)] = 1 
+0

是有可能有它以消极的方式? –

+0

当然。只需使用df.loc [〜df ['Column']。isin(list)] = 1。〜可以用作不是 –

+0

啊好吧thx,我试了!表示没有工作,太多java –