这个问题是我提出的上一个问题的基础,该问题涉及搜索数据帧并打印出包含特定字符串的行,但如果在多个列中找到字符串值,则不重复输出。
原始问题这里。
提供的解决方案有效,除非找不到正在搜索的术语。如果找不到,我会收到以下错误:
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')
您可以在使用内容之前检查 DF 是否为空:
if df.empty:
print('not found')
else:
print(tabulate(df, headers='keys', tablefmt='simple_grid', maxcolwidths=[None, None, 100]))