通过 lambda 函数在数据框中搜索字符串时,如果在任何列或行中都找不到结果,如何解决 IndexError?

问题描述 投票:0回答:1

这个问题是我提出的上一个问题的基础,该问题涉及搜索数据帧并打印出包含特定字符串的行,但如果在多个列中找到字符串值,则不重复输出。

原始问题这里

提供的解决方案有效,除非找不到正在搜索的术语。如果找不到,我会收到以下错误:

Enter search term: foo
Traceback (most recent call last):
  File "f:\Python Stuff\Py Projects\App\DF_Search\fileSearch.py", line 28, in <module>
    print(tabulate(df_f, headers='keys', tablefmt='simple_grid', maxcolwidths=[None, None, 100]))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\Python\Lib\site-packages\tabulate\__init__.py", line 2054, in tabulate
    num_cols = len(list_of_lists[0])
                   ~~~~~~~~~~~~~^^^
IndexError: list index out of range

我使用的数据如下表:

第 1 栏 第 2 栏 第 3 栏 第 4 栏 第 5 栏 第 6 栏 第 7 栏 第 8 栏 第 9 栏 第 10 栏 第11栏 第 12 栏 第 13 栏
ABC-12345 比尔 胜利 1/6/1981 123 456 124 456 125 456 126 456 127 456 128 456 129456 130 456 131 456
ABC-12346 汤姆 窗户 1980年7月31日 789 10 11 12 790 10 11 12 791 10 11 12 792 10 11 12 793 10 11 12 794 10 11 12 795 10 11 12 796 10 11 12 797 10 11 12
ABC-12347 马特 红色 2011 年 1 月 13 日 124 456 125 456 126 456 127 456 128 456 129456 130456 131 456 132 456
ABC-12348 吉姆 红帽 2000年6月10日 790 10 11 12 791 10 11 12 792 10 11 12 793 10 11 12 794 10 11 12 795 10 11 12 796 10 11 12 797 10 11 12 798 10 11 12
ABC-12349 比尔 RHEL 1/6/1981 125 456 126 456 127 456 128 456 129456 130 456 131 456 132 456 133 456
ABC-12350 汤姆 春花 1980年7月31日 791 10 11 12 792 10 11 12 793 10 11 12 794 10 11 12 795 10 11 12 796 10 11 12 797 10 11 12 798 10 11 12 799 10 11 12
ABC-12351 马特 便携式 2011 年 1 月 13 日 126 456 127 456 128 456 129456 130 456 131 456 132 456 133 456 134 456

不一定是干净的代码,但我是第一次尝试从谷歌表格构建数据框,所以请原谅我。

searchterm = input("Enter search term: ")
    sheet1_name = 'MySheetName' 
    sheet1_id = 'MyGoogleSheetID' 
    sheet1_url = f'https://docs.google.com/spreadsheets/d/{sheet1_id}/gviz/tq?tqx=out:csv&sheet={sheet1_name}'
    df = pd.read_csv(sheet1_url)
    df = df[df.map(lambda x: isinstance(x, str) and searchterm.lower() in x.lower()).any(axis=1)] # this is the code that was provided in my previous question that works as expected when a string is found
    print(tabulate(df, headers='keys', tablefmt='simple_grid', maxcolwidths=[None, None, 100]))

如果在数据帧中的任何位置找到字符串,则输出符合预期。

当没有找到搜索词时,期望什么也不会发生,尽管我希望有一个“没有结果”的打印输出。

退回的物品:

Enter search term: foo
Traceback (most recent call last):
  File "f:\Python Stuff\Py Projects\App\DF_Search\fileSearch.py", line 28, in <module>
    print(tabulate(df_f, headers='keys', tablefmt='simple_grid', maxcolwidths=[None, None, 100]))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\Python\Lib\site-packages\tabulate\__init__.py", line 2054, in tabulate
    num_cols = len(list_of_lists[0])
                   ~~~~~~~~~~~~~^^^
IndexError: list index out of range

我尝试添加一个 if 语句,它仍然显示 IndexError 但它可能不在正确的位置:

df_f = df_f[df_f.map(lambda x: isinstance(x, str) and searchterm.lower() in x.lower()).any(axis=1)]
if searchterm in searchterm.lower():
    print(tabulate(df_f, headers='keys', tablefmt='simple_grid', maxcolwidths=[None, None, 100]))
else:
    print('nope')
python dataframe lambda range isinstance
1个回答
0
投票

您可以在使用内容之前检查 DF 是否为空:

if df.empty:
    print('not found')
else:
    print(tabulate(df, headers='keys', tablefmt='simple_grid', maxcolwidths=[None, None, 100]))
© www.soinside.com 2019 - 2024. All rights reserved.