2015-05-12 3 views
2

Возник вопрос. У меня есть список записей, и есть еще один список записей, которые я сравниваю с первым списком. Когда я пишу строку (внутри строки чтения первого списка:Распечатать значение из списка (Значение истины DataFrame является неоднозначной ошибкой)

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 идентификационный номер и КН это имя КН, где матчи PN_stripped

. Но я не могу извлечь данные для дальнейшей обработки.Я просто хочу написать простой, если 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? Например, иногда случаются случаи, когда выпуск акций иногда составляет 3 доллара США, где 2 из них являются «VLN», а третья - «XRS», и в этом случае я должен видеть «если» выход 2 раза VLN без XRS

+0

'если запасы [акции ['Whs'] == 'VLN'].any: print stock' Не работает, поскольку он дает все значения, и я хочу иметь только определенные (как написано выше, есть 2 с 'vln' и один с 'XRS', поэтому я должен видеть только 'VLN' – orangutangas

+0

You нужно указать больше контекста! Вы упомянули тег «sql», поэтому я предполагаю, что это связано с DB. По крайней мере, укажите, какую базу данных вы используете, и какую библиотеку Python вы используете для ее доступа. – taleinat

+0

Использование SQL-Oracle, Python 2.7, library pandas.io.sql и pandas – orangutangas

ответ

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: 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 
+0

EdChum, Спасибо, что это работает, но не так, как для. Для функции FOR я получаю эти результаты, тогда PN соответствует (комментарий выше) – orangutangas

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 

Чтобы быть распечатаны. Те же результаты я получаю с другой функцией Yours:

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

Как можно решить эту проблему и увидеть только строку, которая необходима, чтобы увидеть?

+0

Please отредактируйте это в своем вопросе не как ответ – EdChum

+0

Как новая тема или как мне это сделать? – orangutangas

+0

может быть, как новый вопрос, так как он немного отличается сейчас, прежде чем он стал синтаксической ошибкой, теперь речь идет скорее о достижении желаемого результата, пожалуйста, не забудьте принять мой ответ, в левом верхнем углу моего ответа будет пустой знак – EdChum

Смежные вопросы