根据条件创建布尔列

时间:2019-04-03 21:00:35

标签: python python-3.x pandas numpy

我有一个11列的数据框,我想根据其中两列中的值创建一个新的0,1列。

我已经尝试过使用np.where创建其他列,但不适用于该列。

train["location"] = np.where(3750901.5068 <= train["x"] <= 3770901.5068 
and -19268905.6133 <= train['y'] <= -19208905.6133, 1, 0)

我收到此错误:ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

2 个答案:

答案 0 :(得分:2)

我不确定您在这里甚至不需要np.where。要按元素进行and两个系列,请在此处使用&而不是and。参见:Logical operators for boolean indexing in Pandas

此外,3750901.5068 <= train["x"] <= 3770901.5068似乎在内部被python转换为(3750901.5068 <= train["x"]) and (train["x"] <= 3770901.5068),后者再次具有and,将无法正常工作。因此,您需要将每一个明确地分成例如(3750901.5068 <= train["x"]) & (train["x"] <= 3770901.5068)或使用Series.between,例如train["x"].between(3750901.5068, 3770901.5068, inclusive=True)。参见:How to select rows in a DataFrame between two values, in Python Pandas?

对于&的两个参数,您还需要括号。

因此最终结果应类似于

train["location"] = train["x"].between(3750901.5068, 3770901.5068, inclusive=True) & train['y'].between(-19268905.6133, -19208905.6133, inclusive=True)

这将给您带来一系列的毛病(真与假)。这些已经是引擎盖下的0和1了。如果您确实想要0和1,则可以从here中选择一个解决方案。例如,train.location = train.location.astype(int)

答案 1 :(得分:0)

您可以使用pandas.DataFrame.isin,这将是一个更好的解决方案。另外,是的,您需要括号和&而不是“ and”。 pandas.DataFrame.isin https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.isin.html

的文档

例如:

df=pd.DataFrame({'a':[100,110,120,111,109],'b':[120,345,124,119,127]})
df['c']=np.where((df['a'].isin([100,111])) & (df['b'].isin([120,128])),1,0)

在您的情况下,它将是:

train["location"]=np.where(((train["x"].isin([3750901.5068,3770901.5069])) & (train["y"].isin([-19268905.6133,-19268905.6132])),1,0)