Pandas Dataframe не возвращает результаты для 1 строкового значения в столбце, используя .loc - PullRequest
1 голос
/ 11 апреля 2020

В настоящее время я работаю над диссон-ботом для веб-приложения, которое я планирую создать в будущем и которое использует Pandas для создания кадра данных, в котором хранятся все возможные отбрасывания из экземпляра в WoW. Я создал этого бота, чтобы принимать пользовательский ввод, такой как «! Loot fabric», чтобы хранить «fabric» в качестве аргумента и передавать его в функцию .lo c для поиска в столбце «itemtype» для «fabric». Я сталкиваюсь с интересной ошибкой, где это не работает, если я ищу «кожу».

Это пример кожаной части моего информационного кадра:

    itemname                            itemtype    itemslot    stat1    stat2    source
--  ----------------------------------  ----------  ----------  -------  -------  ----------------------------
32  Corpuscular Leather Greaves         leather     feet        crit     mastery  Carapace of N'Zoth
33  Cord of Anguished Cries             Leather     waist       haste    mastery  Dark Inquisitor Xanesh
34  Gloves of Abyssal Authority         leather     hands       haste    mastery  Drest'agath
35  Spaulders of Aberrant Allure        leather     shoulders   azerite           Il'gynoth, Corruption Reborn
36  Belt of Braided Vessels             Leather     waist       haste    vers     Il'gynoth, Corruption Reborn
37  Stygian Guise                       leather     head        azerite           Maut
38  Boots of Manifest Shadow            leather     feet        haste    mastery  Maut
39  Pauldrons of the Great Convergence  leather     shoulders   azerite           N'Zoth the Corruptor
40  Bracers of Dark Prophecy            leather     wrists      crit     haste    Prophet Skitra
41  Macabre Ritual Pants                leather     legs        crit     vers     Prophet Skitra
42  Gibbering Maw                       leather     head        azerite           Ra-den the Despoiled
43  Wristwraps of Volatile Power        leather     wrists      haste    mastery  Shad'har the Insatiable
44  Chitinspine Gloves                  leather     hands       vers     mastery  The Hivemind
45  Darkheart Robe                      leather     chest       azerite           Vexiona
46  Onyx-Imbued Breeches                leather     legs        vers     mastery  Wrathion, the Black Emperor

Как вы можете видеть, эти элементы хранятся в виде 'leather' в столбце 'itemtype', с сохранением 2 как «Кожа» в попытке отладить проблему.

if message.content.startswith('!loot'):
        arg = message.content.lstrip('!loot ')
        if arg == '1h':
            await message.channel.send('`' + tabulate(df1h, headers='keys', tablefmt='simple') + '`')
        elif arg == '2h':
            await message.channel.send('`' + tabulate(df2h, headers='keys', tablefmt='simple') + '`')
        else:
            result = df1.loc[df1['itemtype'] == arg]
            await message.channel.send('`' + tabulate(result, headers='keys', tablefmt='simple') + '`')  

Это кусок кода, который я использую для обработки ввода пользователя и манипулирования моим фреймом данных, чтобы дать мне информацию, которую запрашивает пользователь. Моя проблема в том, что когда кто-то печатает «! Loot leather», вывод:

itemname    itemtype    itemslot    stat1    stat2    source
----------  ----------  ----------  -------  -------  --------

Но когда они посылают команду «! Loot Leather», в результате получается:

    itemname                 itemtype    itemslot    stat1    stat2    source
--  -----------------------  ----------  ----------  -------  -------  ----------------------------
33  Cord of Anguished Cries  Leather     waist       haste    mastery  Dark Inquisitor Xanesh
36  Belt of Braided Vessels  Leather     waist       haste    vers     Il'gynoth, Corruption Reborn

По какой-то причине он не будет возвращать результаты, если строки сохранены с использованием строчной буквы в столбце itemtype. Имейте в виду, что это работает как предназначено для других переменных в столбце typetype, таких как «ткань», «тарелка», «почта», «аксессуары» и т. Д. c. Для меня было бы возможно просто манипулировать их вводом в заглавную букву первой буквы, но я чувствую, что это бандитское решение.

Есть мысли? Я довольно новичок в python, <1 месяц общего опыта, но эта проблема довольно загадочная для меня, и я не могу получить какую-либо помощь от / r / learn python subreddit и диссонанса python , Любая помощь будет принята с благодарностью. </p>

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Проблема в том, что lstrip удаляет все указанные вами символы слева от строки. 'l' является частью списка символов, которые вы указываете. lstrip получает список символов, а не конкретную строку, которую вы хотите удалить. Попробуйте это:

#import re
#This way we use a regular expression to make sure it matches perfectly
arg = re.sub('^!loot ','',message.content) 

Вместо этой части вашего кода:

arg = message.content.lstrip('!loot ')
0 голосов
/ 12 апреля 2020

Строковый метод .lstrip удаляет начальные символы, которые ему переданы. Таким образом, в вашем случае он удаляет все символы !, l, o, t и из самой левой части строки, на которую он воздействует. Вот почему кожа l удаляется.

Чтобы достичь желаемого результата удаления подстроки '!loot ', используйте .replace('!loot ', ''):

example = '!loot leather' example_stripped = example.lstrip('!loot ') print(example_stripped) # 'eather' example_replaced = example.replace('!loot ', '') print(example_replaced) # 'leather'

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