2

有一个问题。我有一个记录列表,还有另一个记录列表,我正在比较第一个列表。当我写行时(第一个列表的行内读取:

    for index, row in output_merged_po.iterrows():
        stock = output_merged_stock[output_merged_stock['PN_STRIPPED']==row['PN_STRIPPED']][['Whs']]
        print stock

我得到结果

       Whs
 11763 VLN

其中 11763 是 output_merged_stock 的 ID 号,而 Whs 是 PN_stripped 匹配的 whs 的名称。

但我无法提取数据以进行进一步处理。我只想写简单的 if 语句,我可以在其中询问 if whs = VLN。我写:

                    if stock[['Whs']] == 'VLN':
                         print stock

我收到错误:The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我写:

                    if stock == 'VLN':
                        print stock

我又得到了:The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如果我想得到结果'VLN',我应该如何写 if 语句?例如,有时库存输出有时为 3 whs,其中 2 个是“VLN”,第三个是“XRS”,在这种情况下,我应该看到“如果”输出是没有 XRS 的 2 倍 VLN

4

2 回答 2

1

您正在尝试将 df 与一个不正确的标量值进行比较,因为您可能有 1 个或多个匹配项,因此测试标量值变得模棱两可。

我想你想要:

if all(stock['Whs']] == 'VLN'):

或者如果您知道只有一行,那么:

if stock['Whs'].values[0] == 'VLN':

例子:

In [79]:
# create some dummy data
df = pd.DataFrame({'a':np.arange(5), 'b':2})
df
Out[79]:
   a  b
0  0  2
1  1  2
2  2  2
3  3  2
4  4  2

尝试类似您尝试的方法:

if df['a'] == 2:
    print("we have 2")

这引发了:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

所以我们可以从错误中得到提示:

In [82]:

if any(df['a'] == 2):
    print("we have 2")
we have 2

我们可以使用all'b'列:

In [83]:

if all(df['b'] == 2):
    print("all are 2")
all are 2

如果您比较了具有单行值的系列,那么您可以这样做:

In [84]:

if df.iloc[2]['a'] == 2:
    print("we have 2")
​
we have 2

但它变得模棱两可超过 1 行:

if df.iloc[1:3]['b'] == 2:
    print("we have 2")

再次引发ValueError,但以下将起作用:

In [87]:

if df.iloc[1:3]['b'].values[0] == 2:
    print("we have 2")
​
we have 2
于 2015-05-12T21:50:27.053 回答
0

EdChum,谢谢它有效,但不是我想要的方式。对于FOR函数,我得到这些结果,然后 PN 匹配:

          Whs
14883      _
15607     VKO 

所以如果我把

if stock.iloc[0:3]['Whs'].values[0] == '_':
   print stock

我得到如上的结果:

          Whs
14883      _
15607     VKO 

我只需要看到 14883 _ 行。

但是,如果我写第二个 Whs 名称来查找(VKO):

if stock.iloc[0:3]['Whs'].values[0] == 'VKO':
    print stock

我得到空行,没有打印任何信息,而我想看看

          Whs
15607     WKO 

待打印。我用另一个你的函数得到的结果相同:

  if any(stock['Whs'] == '_'):
     print stock

怎么可能解决这个问题,只看到需要看到的线?

于 2015-05-13T13:39:55.660 回答