pri*_*ipe 5 python numpy python-3.x pandas
我有一个包含 11 列的数据框,我想根据其中两列中的值创建一个新的 0,1 列。
我已经尝试使用 np.where 创建其他列,但它不适用于这一列。
train["location"] = np.where(3750901.5068 <= train["x"] <= 3770901.5068
and -19268905.6133 <= train['y'] <= -19208905.6133, 1, 0)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
您可以使用 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)
Run Code Online (Sandbox Code Playgroud)
在你的情况下,它将是:
train["location"]=np.where(((train["x"].isin([3750901.5068,3770901.5069])) & (train["y"].isin([-19268905.6133,-19268905.6132])),1,0)
Run Code Online (Sandbox Code Playgroud)
我不确定你是否需要np.where这里。对于按元素排列的and两个系列,请&在此处使用而不是and。请参阅:Pandas 中布尔索引的逻辑运算符
另外,3750901.5068 <= train["x"] <= 3770901.5068似乎是由 python 内部翻译成的(3750901.5068 <= train["x"]) and (train["x"] <= 3770901.5068),这同样有效,and也不会起作用。因此,您需要将每个显式拆分为 eg(3750901.5068 <= train["x"]) & (train["x"] <= 3770901.5068)或使用Series.betweeneg train["x"].between(3750901.5068, 3770901.5068, inclusive=True)。请参阅:如何在 Python Pandas 中选择 DataFrame 中两个值之间的行?
您还需要用括号来表示 的两个参数&。
所以最终结果应该是这样的
train["location"] = train["x"].between(3750901.5068, 3770901.5068, inclusive=True) & train['y'].between(-19268905.6133, -19208905.6133, inclusive=True)
这将为您提供一系列布尔值(Trues 和 Falses)。这些在幕后就已经只是 0 和 1 了。如果你确实想要 0 和 1,你可以从这里选择一个解决方案。例如,train.location = train.location.astype(int)
| 归档时间: |
|
| 查看次数: |
18513 次 |
| 最近记录: |