从列表中打印值(DataFrame 的真值是不明确的错误)
Print value from a list (The truth value of a DataFrame is ambiguous error)
有个问题。我有一个记录列表,还有另一个记录列表,我正在比较第一个列表。
当我写行时(第一个列表的行内读取:
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 身份证号码,Whs 是 PN_stripped 匹配的 whs 的名称。
但是我无法提取数据进行进一步处理。我只想写一个简单的 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().
如果想得到结果,if语句应该怎么写'VLN'?例如,有时库存输出有时是 3 whs,其中 2 个是 'VLN',第三个是 'XRS',在这种情况下,我应该看到 'if' 输出是 VLN 的 2 倍没有 XRS
您正在尝试比较这里不需要的 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: The truth value of a Series is ambiguous. Use a.empty,
a.bool(), a.item(), a.any() or 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
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
如何解决该问题并只看到需要查看的一行?
有个问题。我有一个记录列表,还有另一个记录列表,我正在比较第一个列表。 当我写行时(第一个列表的行内读取:
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 身份证号码,Whs 是 PN_stripped 匹配的 whs 的名称。
但是我无法提取数据进行进一步处理。我只想写一个简单的 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().
如果想得到结果,if语句应该怎么写'VLN'?例如,有时库存输出有时是 3 whs,其中 2 个是 'VLN',第三个是 'XRS',在这种情况下,我应该看到 'if' 输出是 VLN 的 2 倍没有 XRS
您正在尝试比较这里不需要的 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: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or 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
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
如何解决该问题并只看到需要查看的一行?