从列表中打印值(DataFrame的真值是模糊错误)

时间:2015-05-12 05:39:10

标签: python pandas pandasql

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

    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 statetement,我可以询问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

2 个答案:

答案 0 :(得分:1)

你试图比较一个df(顺便说一下这里不需要),标量值是不正确的,因为它对于测试标量值变得不明确,因为你可能有一个或多个匹配。

我想你想要:

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:系列的真值是不明确的。使用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

答案 1 :(得分:0)

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

          Whs
14883      _
15607     VKO 

所以,如果我把

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

我得到的结果如上:

          Whs
14883      _
15607     VKO 

我只需要看14883 _ line。

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

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

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

          Whs
15607     WKO 

要打印。我用另一个你的功能得到的结果相同:

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

如何解决这个问题,只看到需要查看的一行?