【问题标题】:Operands could not be broadcast together error when two rows used使用两行时,操作数无法一起广播错误
【发布时间】:2025-12-03 01:45:02
【问题描述】:

使用以下数据:

import datetime,numpy as np,pandas as pd
nan = np.nan

a = pd.DataFrame(  {'price': {datetime.time(9, 0): 1,   datetime.time(10, 0): 0,   datetime.time(11, 0): 3,   datetime.time(12, 0): 4,   datetime.time(13, 0): 7,   datetime.time(14, 0): 6,   datetime.time(15, 0): 5,   datetime.time(16, 0): 4,   datetime.time(17, 0): 0,   datetime.time(18, 0): 2,   datetime.time(19, 0): 4,   datetime.time(20, 0): 7},  'reversal': {datetime.time(9, 0): 1,   datetime.time(10, 0): nan,   datetime.time(11, 0): nan,   datetime.time(12, 0): nan,   datetime.time(13, 0): nan,
  datetime.time(14, 0): 6.0,   datetime.time(15, 0): nan,   datetime.time(16, 0): nan,   datetime.time(17, 0): nan,   datetime.time(18, 0): nan,   datetime.time(19, 0): nan,   datetime.time(20, 0): nan}})


a['target_hit']=nan;
a['target_miss']=nan;
a['reversal1']=a['reversal']+1;
a['reversal2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);

我创建一个子集如下:

hit = a.ix[:,:-2].dropna()
hit

这会给出显示两行匹配的输出:

         price  reversal  reversal1 reversal2
 09:00:00   1   1.0         2.0     0.0
 14:00:00   6   6.0         7.0     0.0

当我尝试使用这些行来匹配以下行时,我收到此错误ValueError: operands could not be broadcast together with shapes (2,) (12,)

takeBoth = False
targetIsHit,targetIsMiss = False,False

if takeBoth:

    targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
    targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)];

    targetIsHit,targetIsMiss = not targetHit.empty, not targetMiss.empty

else:

    targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
    targetIsHit = not targetHit.empty
    if not targetIsHit:
         targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)]; 
         targetIsMiss = not targetMiss.empty

if targetIsHit:a.loc[hit.index.values,"target_hit"] = targetHit.index.values;
if targetIsMiss:a.loc[hit.index.values,"target_miss"] = targetMiss.index.values;

如果hit = a.ix[:,:-2].dropna() 只生成一行,我不会收到此错误。在阅读了这个之后,我发现这可能是由于广播规则。

我应该遍历hit 中的行以避免这种情况吗?请对如何解决此问题有任何其他建议?

【问题讨论】:

  • 执行hit['reversal1'].values == a['price'].values时出现错误。你不应该像这样进行元素比较(例如使用np.equals)。不过,在您的具体情况下,我会确保 hit['reversal1'] 评估为标量,例如我将 hit 替换为 hit.iloc[0] 以仅选择其第一行。
  • 你能告诉我怎么做吗@Kris?
  • 在您的第二个单元格中尝试hit = hit.iloc[0],然后尝试评估您的第三个单元格。

标签: python pandas


【解决方案1】:

是的,它必须是 for 循环...现在我将其更改为先从命中或未命中中选择。

import datetime,numpy as np,pandas as pd;
nan = np.nan;

a = pd.DataFrame(  {'price': {datetime.time(9, 0): 1,   datetime.time(10, 0): 0,   datetime.time(11, 0): 3,   datetime.time(12, 0): 4,   datetime.time(13, 0): 7,   datetime.time(14, 0): 6,   datetime.time(15, 0): 5,   datetime.time(16, 0): 4,   datetime.time(17, 0): 0,   datetime.time(18, 0): 2,   datetime.time(19, 0): 4,   datetime.time(20, 0): 7},  'reversal': {datetime.time(9, 0): 1,   datetime.time(10, 0): nan,   datetime.time(11, 0): nan,   datetime.time(12, 0): nan,   datetime.time(13, 0): nan,
  datetime.time(14, 0): 6.0,   datetime.time(15, 0): nan,   datetime.time(16, 0): nan,   datetime.time(17, 0): nan,   datetime.time(18, 0): nan,   datetime.time(19, 0): nan,   datetime.time(20, 0): nan}});


a['target_hit']=a['target_miss']=nan;
a['reversal1']=a['reversal']+1;
a['reversal2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);

hits = a.ix[:,:-2].dropna();

for row,hit in hits.iterrows():

        forwardRows = [row]<a['price'].index.values

        targetHit = a.index.values[(hit['reversal1']==a['price'].values) & forwardRows][0];
        targetMiss = a.index.values[(hit['reversal2']==a['price'].values) & forwardRows][0];

        if targetHit>targetMiss:
            a.loc[row,"target_miss"] = targetMiss;
        else:
            a.loc[row,"target_hit"] = targetHit;


print '#'*50
print a
'''
    ##################################################
##################################################
          price  reversal  reversal1  reversal2  target_hit target_miss
09:00:00      1       1.0        2.0        0.0         NaN    10:00:00
10:00:00      0       NaN        NaN        NaN         NaN         NaN
11:00:00      3       NaN        NaN        NaN         NaN         NaN
12:00:00      4       NaN        NaN        NaN         NaN         NaN
13:00:00      7       NaN        NaN        NaN         NaN         NaN
14:00:00      6       6.0        7.0        0.0         NaN    17:00:00
15:00:00      5       NaN        NaN        NaN         NaN         NaN
16:00:00      4       NaN        NaN        NaN         NaN         NaN
17:00:00      0       NaN        NaN        NaN         NaN         NaN
18:00:00      2       NaN        NaN        NaN         NaN         NaN
19:00:00      4       NaN        NaN        NaN         NaN         NaN
20:00:00      7       NaN        NaN        NaN         NaN         NaN
'''

【讨论】:

最近更新 更多