Python 获取Numpy where条件的错误

Python 获取Numpy where条件的错误,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我正在尝试使用数据库中其他列的np.where条件创建一个新列 我的代码 df5['RiskSubType']=np.where(new_df['Snow_Risk']==1,(( ' Heavy Snow forecasted at ' +df5.LOCATION.mask(new_df.LOCATION=='',df5.LOCATION_CITY))), np.where(df5['Wind_Risk']==1,( ' Heavy Wind forecasted at ' +df5.

我正在尝试使用数据库中其他列的
np.where
条件创建一个新列

我的代码

  df5['RiskSubType']=np.where(new_df['Snow_Risk']==1,(( ' Heavy Snow forecasted at  ' +df5.LOCATION.mask(new_df.LOCATION=='',df5.LOCATION_CITY))),
np.where(df5['Wind_Risk']==1,( ' Heavy Wind forecasted at  ' +df5.LOCATION.mask(df5.LOCATION=='',df5.LOCATION_CITY)),
np.where(df5['Precip_Risk']==1,( ' Heavy Rain forecasted at  ' +df5.LOCATION.mask(df5.LOCATION=='',df5.LOCATION_CITY)),"No Risk Identified")))
错误


如何解决此问题或以其他方式解决此问题。

请提供以下内容:

d = {'LOCATION': ['?', '?'],
     'LOCATION_CITY': ['?', '?'],
     'Wind_Risk': [1, 0],
     'Precip_Risk': [1, 0],
     'Snow_Risk': [1, 0]}

df = pd.DataFrame(data=d)

请提供如下内容:

d = {'LOCATION': ['?', '?'],
     'LOCATION_CITY': ['?', '?'],
     'Wind_Risk': [1, 0],
     'Precip_Risk': [1, 0],
     'Snow_Risk': [1, 0]}

df = pd.DataFrame(data=d)

首先,你的设计/代码风格很难理解,你应该考虑简化它。 出现问题的原因是,您试图在
np.where
函数中粉碎字符串和数组。报告说:

其中(条件[,x,y])

返回根据条件从x或y中选择的元素

参数:

条件:类似阵列,布尔

如果为真,则为x,否则为y。
x、 y:数组_-like
要从中选择的值。x、 y和状态需要能够广播到某种形状

返回:

出:恩达雷

一个数组,其元素来自条件为真的x,元素来自其他地方的y

正如您所看到的,x和y需要能够广播到某些形状。查看以下内容:

6.4。广播

Numpy的另一个强大功能是广播。广播需要 在不同形状的数组之间执行操作时放置。 比如说

>>> a = np.array([
    [0, 1],
    [2, 3],
    [4, 5],
    ])
>>> b = np.array([10, 100])
>>> a * b
array([[  0, 100],
       [ 20, 300],
       [ 40, 500]])
a和b的形状不匹配。为了继续,Numpy将 将b拉伸到第二个维度,好像它被堆叠了三次 自作主张。然后,操作将按元素进行

广播的规则之一是,只有大小为1的尺寸才能播放 拉伸(如果数组只有一个维度,则所有其他维度 被视为用于广播目的,尺寸为1)。在 上面的示例b是1D,具有形状(2,)。用于使用, 它有两个维度,Numpy将大小为1的另一个维度添加到b。 b现在有形状(1,2)。这个新维度现在可以拉伸三倍 使b的形状与a的形状(3,2)匹配的时间

另一个规则是从最后一个维度到最后一个维度进行比较 第一。任何不匹配的标注都必须拉伸才能成为 同样大小。但是,根据之前的规则,只有 尺寸为1的尺寸可以拉伸。这意味着某些形状不能 广播和Numpy将给您一个错误:

>>> c = np.array([
    [0, 1, 2],
    [3, 4, 5],
    ])
>>> b = np.array([10, 100])
>>> c * b
ValueError: operands could not be broadcast together with shapes (2,3) (2,)
这里发生的是,Numpy再次向b添加了一个维度,使 它的形状是(1,2)。b和c最后尺寸的尺寸(2和 3)进行比较,发现不同。既然没有 这些尺寸为Numpy给出的尺寸1(因此,不可拉伸) 向上移动并产生错误

将上面的c和b相乘的解决方案是 Numpy必须添加该额外维度作为 B这是通过使用None为第二个维度编制索引来实现的。这个 然后,b的形状变成(2,1),这与广播兼容 用c:

>>> c = np.array([
    [0, 1, 2],
    [3, 4, 5],
    ])
>>> b = np.array([10, 100])
>>> c * b[:, None]
array([[  0,  10,  20],
       [300, 400, 500]])
这些规则的良好视觉描述,以及一些高级 广播应用程序可以在Numpy广播规则教程中找到


所以问题是,您试图将
(n,)
(第一个位置)广播到
标量
(第一个字符串)广播到
(m,)
(第二个位置)广播到
标量
(第二个字符串)广播到
(k,)
(第三个位置)等等。自
n!=m!=k
可以也将是这样,拉伸的尺寸与广播不匹配。

因此,首先,你的设计/代码风格很难理解,你应该考虑简化它。 出现问题的原因是,您试图在
np.where
函数中粉碎字符串和数组。报告说:

其中(条件[,x,y])

返回根据条件从x或y中选择的元素

参数:

条件:类似阵列,布尔

如果为真,则为x,否则为y。
x、 y:数组_-like
要从中选择的值。x、 y和状态需要能够广播到某种形状

返回:

出:恩达雷

一个数组,其元素来自条件为真的x,元素来自其他地方的y

正如您所看到的,x和y需要能够广播到某些形状。查看以下内容:

6.4。广播

Numpy的另一个强大功能是广播。广播需要 在不同形状的数组之间执行操作时放置。 比如说

>>> a = np.array([
    [0, 1],
    [2, 3],
    [4, 5],
    ])
>>> b = np.array([10, 100])
>>> a * b
array([[  0, 100],
       [ 20, 300],
       [ 40, 500]])
a和b的形状不匹配。为了继续,Numpy将 将b拉伸到第二个维度,好像它被堆叠了三次 自作主张。然后,操作将按元素进行

广播的规则之一是,只有大小为1的尺寸才能播放 拉伸(如果数组只有一个维度,则所有其他维度 被视为用于广播目的,尺寸为1)。在 上面的示例b是1D,具有形状(2,)。用于使用, 它有两个维度,Numpy将大小为1的另一个维度添加到b。 b现在有形状(1,2)。这个新维度现在可以拉伸三倍 使b的形状与a的形状(3,2)匹配的时间

另一个规则是从最后一个维度到最后一个维度进行比较 第一。任何不匹配的标注都必须拉伸才能成为 同样大小。但是,根据之前的规则,只有 尺寸为1的尺寸可以拉伸。这意味着某些形状不能 广播和Numpy将给您一个错误:

>>> c = np.array([
    [0, 1, 2],
    [3, 4, 5],
    ])
>>> b = np.array([10, 100])
>>> c * b
ValueError: operands could not be broadcast together with shapes (2,3) (2,)
这里发生的是,Numpy再次向b添加了一个维度,使 它的形状是(1,2)。b和c最后尺寸的尺寸(2和 3)进行比较,发现不同。既然没有 这些尺寸的尺寸为1(有