我有一个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()。
答案 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)