【问题标题】:How to obtain a value from a df irrespective if the user input has capital letter or not无论用户输入是否有大写字母,如何从 df 获取值
【发布时间】:2019-09-18 10:54:17
【问题描述】:

我有一个df,如下:

    BDEW    Article
0   999     Cola
1   998     Fanta
2   997     Sprite
3   996     Dew
4   995     Water

我们可以看到Article列中每篇文章的第一个字母都以大写字母开头。我要求用户选择一篇文章。如果用户在开始时输入带有大写字母的名称,我的代码可以正常工作。但是如果用户输入cola 而不是Cola,我会得到一个错误:

是否要添加细分 (Y/N)?:y

您想添加哪篇文章?:cola Traceback(最近通话 最后):

文件“”,第 5 行,在 bdew_value = df.loc[df['Article'] == article, 'BDEW'].iloc[0]

文件 "C:\Users\kashy\Anaconda3\envs\py36\lib\site-packages\pandas\core\indexing.py", 第 1410 行,在 getitem 中 return self._getitem_axis(maybe_callable, axis=axis)

文件 "C:\Users\kashy\Anaconda3\envs\py36\lib\site-packages\pandas\core\indexing.py", 第 2132 行,在 _getitem_axis self._validate_integer(key, axis)

文件 "C:\Users\kashy\Anaconda3\envs\py36\lib\site-packages\pandas\core\indexing.py", 第 2063 行,在 _validate_integer 中 raise IndexError("单个位置索引器越界")

IndexError: 单个位置索引器超出范围

我认为错误是因为我在代码中使用了.iloc

有没有办法可以克服这个问题,即使用户在开头插入一个带有小写字母的名称,代码也应该可以工作。

我的代码:

i = 0
while True:
    add_seg = input('Do you want to add a segment (Y/N)?: ')
    if (add_seg == 'Y')|(add_seg == 'y'):
        article = (input('Which article would you like to add?: ')).lower()
        bdew_value = df.loc[df['Article'] == article, 'BDEW'].iloc[0]
        i = i + 1
        INVOIC.add_segment(Segment('LIN', str(i), '', [str(bdew_value), 'Z01']))

    elif (add_seg == 'N')|(add_seg == 'n'):
        break

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    将用户输入的内容转换为大写,然后进行比较。比如:

    article = (input('Which article would you like to add?: ')).upper()

    您说过,要使程序正常工作,第一个字母必须是大写字母。所以我想剩下的都无所谓了。

    或者,如果您愿意,您只能将第一个字母转换为大写:

    article = (input('Which article would you like to add?: ')).capitalize()

    【讨论】:

    • .capitalize() 效果很好。谢谢你。我会接受答案
    • 我很高兴能帮上忙 :)
    【解决方案2】:

    过滤似乎没有返回任何行,df.loc[df['Article'] == article, 'BDEW']返回一个空数据框。您可以将.iloc[0] 替换为.get(0),然后控制bdew_value 不是None,如果是,则再次提示用户,提示未找到与上一个输入的匹配项。

    现在,过滤返回空行的原因是您应该 .captialize 输入(或 .lower 'Article' 列)以匹配大小写。但请务必考虑前一段,一般来说,即使在这种情况下遇到的具体问题已得到解决。

    我希望这会有所帮助:-)

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多