Как перебрать столбец в кадре данных для поиска определенного значения? - PullRequest
1 голос
/ 14 мая 2019

У меня есть набор данных имен питомцев и владельцев:

Pets    Owners
dog     James
dog     Katelyn
rat     Shelly
cat     Bob

Я хочу иметь возможность искать в столбце «Владельцы», чтобы найти имя «Кейтлин», а затем распечатать векторное имя для данного владельца. Пока у меня есть это:

def pet_name():
    owner = input("What is the Owner name? ")

    # check to see if owner exist in pets dataset
    # if ownderID exist then print corresponding pet names
    if owner in pets['Owners']: 
        print( pets[['Pets','Owners']][pets.Owners == owner])

    # if ownerID doesnt' exist
    elif not age: 
        print("Sorry, this Owner doesn't exist. Try again! ")


    # if no ownerID has been entered at all 
    else: 
        print("You didn't enter any Owner. Try again! ")

Когда я ввожу имя для поиска, оно автоматически переходит к другой части кода. Как я могу это исправить? Должен ли я использовать itterows ()?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Сначала давайте посмотрим, в чем проблема, затем мы сможем найти способ ее исправить.

In [1]: import pandas as pd

In [2]: pets = pd.read_csv('pets.csv')

In [3]: pets
Out[3]:
  Pets   Owners
0  dog    James
1  dog  Katelyn
2  rat   Shelly
3  cat      Bob

In [4]: type(pets["Owners"])
Out[4]: pandas.core.series.Series

Мы можем видеть, что pets является pandas.Series объектом. Теперь проблема очевидно в этой строке кода:

if owner in pets['Owners']:

Вот почему вы не можете использовать оператор in с pandas.Series, но в основном это потому, что разработчики Pandas не реализовали этот модуль таким способом, который был бы возможен для используйте " Операции проверки членства ", как это. Поэтому, как вы упомянули сами, это всегда вернет False:

In [5]: owner in pets["Owners"]
Out[5]: False

Теперь, если вы хотите использовать pets["Owners"], вы можете сделать это следующим образом (как предложено @ piRSquared ):

In [6]: owner in pets["Owners"].values
Out[6]: True

Однако, если мы посмотрим на документацию для pandas.Series.values:

Предупреждение: Мы рекомендуем использовать Series.array или Series.to_numpy () , в зависимости от того, нужна ли вам ссылка на базовые данные или Массив NumPy.

Итак, мы можем сделать это так:

In [7]: owner in pets["Owners"].array
Out[7]: True

Есть также лучший способ сделать это, вы хотите узнать, «есть ли домашние животные для данного владельца», правильно? Если это так, вы можете сделать это так:

In [8]: pet = pets.loc[pets["Owners"] == owner, "Pets"]

In [8]: if pet.any():
   ...:     print(pet)
   ...: else:
   ...:     print("You didn't enter any Owner. Try again! ")
Out[8]:
1    dog
Name: Pets, dtype: object

Как видите, будет напечатан объект pandas.Series. У вас есть упомянутое , что вам нужно в формате «вектор / список / массив». Это немного неясно, но я думаю, что ситуация в том, что owner может иметь несколько pets, и вы хотите проверить, имеет ли owner любой pets, а затем вывести все их pets в формате списка. Если это так, вы можете использовать pet.array. Например, если мы изменим ваш набор данных так, чтобы у Katelyn было более одного питомца:

Pets    Owners
dog     James
dog     Katelyn
rat     Katelyn <-----
rat     Shelly
cat     Bob

Тогда мы можем видеть, что это дает нам список:

In [9]: if pet.any():
    ...:     print(pet.array)
    ...: else:
    ...:     print("You didn't enter any Owner. Try again! ")
Out[9]: 
<PandasArray>
['dog', 'rat']
Length: 2, dtype: object
0 голосов
/ 14 мая 2019

При проверке, если owner in pets['Owners'] вы используете pets в контексте словаря, он проверяет, находится ли owner в индексе pets. Вместо этого проверьте, если owner in pets['Owners'].values

Тем не менее, я бы предпочел, чтобы pet_name было написано так:

def pet_name():
    owner = input("What is the Owner name? ")

    # check to see if owner exist in pets dataset
    # if ownderID exist then print corresponding pet names
    mask = pets['Owners'] == owner
    if mask.any():
        print(pets.loc[mask, ['Pets', 'Owners']])

    # if ownerID doesnt' exist
    elif not age: 
        print("Sorry, this Owner doesn't exist. Try again! ")


    # if no ownerID has been entered at all 
    else: 
        print("You didn't enter any Owner. Try again! ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...