Python IF IN оператор со списком - PullRequest
0 голосов
/ 09 июня 2018

Могу ли я получить небольшую помощь в том, что я уверен, что это простое решение.Я искал здесь и в Интернете, и не смог решить.Мне меньше недели, и я в основном поставил перед собой небольшую задачу, чтобы выучить некоторые основы.

import pandas as pd

df1 = pd.read_csv('booking.csv', names=['snum','booked','name'])
df1.drop(['booked', 'name'], axis=1, inplace=True)

df2 = df1.values.tolist()

print('The following tickets are available; %s' % df2)
tic = input('Which ticket would you like to buy? ')

if tic in df2:
    print('Ok')
else:
    print('Ticket Unavilable')

Проблема, с которой я столкнулся, связана с оператором If.Независимо от того, какое значение я использую в качестве ввода, я всегда получаю сообщение «Билет недоступен».Я полагаю, что ошибка должна быть связана со списком, который был покрыт из фрейма данных.

Пока что я;

  • Протестировал оператор IF против списка, который еще не былпреобразован или импортирован, и это сработало как ожидалось
  • «Напечатал» тип переменной df2, чтобы подтвердить, что это список
  • Переменные df2 появляются в печатном вопросе, поэтому я знаю, что они были импортированы ипреобразовано в ok
  • Скопируйте и вставьте в другой файл Python с тем же результатом

Переменными являются базовые номера мест A1, A2, A3, A4, A5, B1, B2, B3, B4, B5.Я знаю, что ввод 'A' 'B' ect также вернул бы 'OK', практичность не так важна, как функциональность.

Ответы [ 4 ]

0 голосов
/ 09 июня 2018

Измените

if tic in df2:

на

if any(tic in s for s in df2):

У вас есть список, но вы пытаетесь получить к нему доступ как к Panda Dataframe.

booking.csv

snum    booked  name
a1      no  
a2      no  
a3      no  
a4      no  
a5      no  
a6      no  
a7      no  
a8      no  
a9      no  
a10     no  
a11     no
a12     no
a13     no
b1      no
b2      no
b3      no
b4      no
b5      no
b6      no
b7      no
b8      no
b9      no
b10     no
b11     no
b12     no
b13     no

Ваш пример с модификацией

import pandas as pd

df1 = pd.read_csv('booking.csv', names=['snum','booked','name'])
df1.drop(['booked', 'name'], axis=1, inplace=True)

df2 = df1.values.tolist()

print('The following tickets are available; %s' % df2)
tic = input('Which ticket would you like to buy? ')

if any(tic in s for s in df2):#df2.str.contains(tic):
    print('Ok')
else:
    print('Ticket Unavilable')

Дает следующий вывод

The following tickets are available; [['snum'], ['a1'], ['a2'], ['a3'], ['a4'], ['a5'], ['a6'], ['a7'], ['a8'], ['a9'], ['a10'], ['a11'], ['a12'], ['a13'], ['b1'], ['b2'], ['b3'], ['b4'], ['b5'], ['b6'], ['b7'], ['b8'], ['b9'], ['b10'], ['b11'], ['b12'], ['b13']]

Which ticket would you like to buy? a1
Ok

или

The following tickets are available; [['snum'], ['a1'], ['a2'], ['a3'], ['a4'], ['a5'], ['a6'], ['a7'], ['a8'], ['a9'], ['a10'], ['a11'], ['a12'], ['a13'], ['b1'], ['b2'], ['b3'], ['b4'], ['b5'], ['b6'], ['b7'], ['b8'], ['b9'], ['b10'], ['b11'], ['b12'], ['b13']]

Which ticket would you like to buy? c2
Ticket Unavilable
0 голосов
/ 09 июня 2018

pd.DataFrame.values.tolist дает вложенный список.

pd.Series.values.tolist дает не вложенный список, предполагая, что элементы вашей серии не являются самими списками.

Чтобы понять, что здесь происходит, вам нужночтобы понять, что массивы NumPy используются внутри Pandas.Атрибут values объектов pd.DataFrame и pd.Series извлекает соответствующий массив NumPy.Для фрейма данных это всегда будет двухмерным, даже если ваш фрейм данных имеет одну серию.

Разрешение для вложенных списков ясно в NumPy документах :

ndarray. tolist ()

Возвращает массив в виде (возможно, вложенного) списка.

У вас есть несколько вариантов:

pd.Series.values ​​

Для изолированной проверки членства в серии можно использовать pd.Series.values:

vals = df1['snum'].values

if tic in vals:
    # do something

set

Используется O(1) поиск и рекомендуется, если вы будете неоднократно проверять членство в одной серии:

snum_set = set(df1['snum'])

if tic in snum_set:
    # do something
0 голосов
/ 09 июня 2018

Похоже, вы не используете правильный метод DataFrame для получения списка билетов.Используйте DataFrame.to_dict('records') для упрощения извлечения имен билетов.

booking.csv

92747,true,Harry Potter
28479,false,Sherlock Holmes

Код Python

import pandas as pd

# Load ticket list from CSV file
booking_df = pd.read_csv('booking.csv', names=['snum','booked','name'])

# Convert ticket list to a list of built-in Python dictionaries
ticket_list = booking_df.to_dict('records')

# Extract the ticket names from the list of tickets
ticket_name_set = {ticket["name"] for ticket in ticket_list}

print('The following tickets are available; %s' % ticket_name_set)
wanted_ticket_name = input('Which ticket would you like to buy? ')

if wanted_ticket_name in ticket_name_set:
    print('Ok')
else:
    print('Ticket Unavilable')

Вывод:

➜ python tickets.py
The following tickets are available; ['Harry Potter', 'Sherlock Holmes']
Which ticket would you like to buy? Harry Potter
Ok
➜ python tickets.py
The following tickets are available; ['Harry Potter', 'Sherlock Holmes']
Which ticket would you like to buy? Hamlet
Ticket Unavilable
0 голосов
/ 09 июня 2018

Похоже, что pandas.DataFrame.values.tolist не производит то, что вы думаете:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame.from_records([dict(a=1), dict(a=2)])

In [3]: df
Out[3]: 
   a
0  1
1  2

In [4]: df.values.tolist()
Out[4]: [[1], [2]]

В вашем случае tic - это строка, но df.values.tolist() - это вложенный список.Я думаю, что вы хотите:

df2 = set(df1['snum'])

Я использовал набор, потому что хеш-таблицы больше подходят для поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...