如何处理从应用 isbnlib.meta 到 pandas 返回的错误
How to handle returned errors from applying isbnlib.meta with pandas
我正在使用 isbnlib.meta
,它会在您输入 isbn 时提取元数据(书名、作者、出版年份等)。我有一个包含 482,000 个 isbn 的数据框(列标题:isbn13)。当我 运行 这个函数时,我会得到一个像 NotValidISBNError
这样的错误,它停止了它的轨道中的代码。我想要发生的是,如果出现错误,代码将简单地跳过该行并移至下一行。
这是我的代码:
list_df[0]['publisher_isbnlib'] = list_df[0]['isbn13'].apply(lambda x: isbnlib.meta(x).get('Publisher', None))
list_df[0]['yearpublished_isbnlib'] = list_df[0]['isbn13'].apply(lambda x: isbnlib.meta(x).get('Year', None))
#list_df[0]['language_isbnlib'] = list_df[0]['isbn13'].apply(lambda x: isbnlib.meta(x).get('Language', None))
list_df[0]
list_df[0]
是前 20,000 行,因为我试图通过数据帧进行分块。我刚刚手动输入此代码 24 次以处理每个块。
我尝试了 try: 和 except: 但最终发生的只是代码停止,我没有收到任何元数据报告。
回溯:
---------------------------------------------------------------------------
NotValidISBNError Traceback (most recent call last)
<ipython-input-39-a06c45d36355> in <module>
----> 1 df['meta'] = df.isbn.apply(isbnlib.meta)
e:\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
4198 else:
4199 values = self.astype(object)._values
-> 4200 mapped = lib.map_infer(values, f, convert=convert_dtype)
4201
4202 if len(mapped) and isinstance(mapped[0], Series):
pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()
e:\Anaconda3\lib\site-packages\isbnlib\_ext.py in meta(isbn, service)
23 def meta(isbn, service='default'):
24 """Get metadata from Google Books ('goob'), Open Library ('openl'), ..."""
---> 25 return query(isbn, service) if isbn else {}
26
27
e:\Anaconda3\lib\site-packages\isbnlib\dev\_decorators.py in memoized_func(*args, **kwargs)
22 return cch[key]
23 else:
---> 24 value = func(*args, **kwargs)
25 if value:
26 cch[key] = value
e:\Anaconda3\lib\site-packages\isbnlib\_metadata.py in query(isbn, service)
18 if not ean:
19 LOGGER.critical('%s is not a valid ISBN', isbn)
---> 20 raise NotValidISBNError(isbn)
21 isbn = ean
22 # only import when needed
NotValidISBNError: (abc) is not a valid ISBN
没有看到代码很难回答,但 try/except 应该真的能够处理这个问题。
我不是这里的专家,但是看看这段代码:
l = [0, 1, "a", 2, 3]
for item in l:
try:
print(item + 1)
except TypeError as e:
print(item, "is not integer")
如果您尝试对字符串进行加法运算,python 会反对并使用 TypeError
退出。因此,您使用 except 捕获了 TypeError
并可能报告了一些相关信息。当我 运行 此代码时:
1
2
a is not integer # exception handled!
3
4
您应该能够使用 except NotValidISBNError
处理您的异常,然后报告您喜欢的任何元数据。
您可以通过异常处理变得更加复杂,但这是基本思想。
- 当前用于提取 isbn 元数据的实施非常缓慢且效率低下。
- 如前所述,有 482,000 个唯一的 isbn 值,其数据被多次下载(例如,每列一次,如代码当前所写)
- 最好一次下载所有元数据,然后从
dict
中提取数据作为单独的操作。
- A
try-except
块用于捕获来自无效 isbn 值的错误。
- 返回空
dict
、{}
,因为 pd.json_normalize
不能与 NaN
或 None
一起使用。
- 不需要分块 isbn 列。
pd.json_normalize
用于扩展.meta
返回的dict
。
- 使用
pandas.DataFrame.rename
重命名列,使用 pandas.DataFrame.drop
删除列。
- 此实现将比当前实现快得多,并且对用于获取元数据的 API 的请求将大大减少。
- 要从
lists
中提取值,例如 'Authors'
列,请使用 df_meta = df_meta.explode('Authors')
;如果有多位作者,列表中每多一位作者都会创建一个新行。
import pandas as pd # version 1.1.3
import isbnlib # version 3.10.3
# sample dataframe
df = pd.DataFrame({'isbn': ['9780446310789', 'abc', '9781491962299', '9781449355722']})
# function with try-except, for invalid isbn values
def get_meta(col: pd.Series) -> dict:
try:
return isbnlib.meta(col)
except isbnlib.NotValidISBNError:
return {}
# get the meta data for each isbn or an empty dict
df['meta'] = df.isbn.apply(get_meta)
# df
isbn meta
0 9780446310789 {'ISBN-13': '9780446310789', 'Title': 'To Kill A Mockingbird', 'Authors': ['Harper Lee'], 'Publisher': 'Grand Central Publishing', 'Year': '1988', 'Language': 'en'}
1 abc {}
2 9781491962299 {'ISBN-13': '9781491962299', 'Title': 'Hands-On Machine Learning With Scikit-Learn And TensorFlow - Techniques And Tools To Build Learning Machines', 'Authors': ['Aurélien Géron'], 'Publisher': "O'Reilly Media", 'Year': '2017', 'Language': 'en'}
3 9781449355722 {'ISBN-13': '9781449355722', 'Title': 'Learning Python', 'Authors': ['Mark Lutz'], 'Publisher': '', 'Year': '2013', 'Language': 'en'}
# extract all the dicts in the meta column
df = df.join(pd.json_normalize(df.meta)).drop(columns=['meta'])
# extract values from the lists in the Authors column
df = df.explode('Authors')
# df
isbn ISBN-13 Title Authors Publisher Year Language
0 9780446310789 9780446310789 To Kill A Mockingbird Harper Lee Grand Central Publishing 1988 en
1 abc NaN NaN NaN NaN NaN NaN
2 9781491962299 9781491962299 Hands-On Machine Learning With Scikit-Learn And TensorFlow - Techniques And Tools To Build Learning Machines Aurélien Géron OReilly Media 2017 en
3 9781449355722 9781449355722 Learning Python Mark Lutz 2013 en
我正在使用 isbnlib.meta
,它会在您输入 isbn 时提取元数据(书名、作者、出版年份等)。我有一个包含 482,000 个 isbn 的数据框(列标题:isbn13)。当我 运行 这个函数时,我会得到一个像 NotValidISBNError
这样的错误,它停止了它的轨道中的代码。我想要发生的是,如果出现错误,代码将简单地跳过该行并移至下一行。
这是我的代码:
list_df[0]['publisher_isbnlib'] = list_df[0]['isbn13'].apply(lambda x: isbnlib.meta(x).get('Publisher', None))
list_df[0]['yearpublished_isbnlib'] = list_df[0]['isbn13'].apply(lambda x: isbnlib.meta(x).get('Year', None))
#list_df[0]['language_isbnlib'] = list_df[0]['isbn13'].apply(lambda x: isbnlib.meta(x).get('Language', None))
list_df[0]
list_df[0]
是前 20,000 行,因为我试图通过数据帧进行分块。我刚刚手动输入此代码 24 次以处理每个块。
我尝试了 try: 和 except: 但最终发生的只是代码停止,我没有收到任何元数据报告。
回溯:
---------------------------------------------------------------------------
NotValidISBNError Traceback (most recent call last)
<ipython-input-39-a06c45d36355> in <module>
----> 1 df['meta'] = df.isbn.apply(isbnlib.meta)
e:\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
4198 else:
4199 values = self.astype(object)._values
-> 4200 mapped = lib.map_infer(values, f, convert=convert_dtype)
4201
4202 if len(mapped) and isinstance(mapped[0], Series):
pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()
e:\Anaconda3\lib\site-packages\isbnlib\_ext.py in meta(isbn, service)
23 def meta(isbn, service='default'):
24 """Get metadata from Google Books ('goob'), Open Library ('openl'), ..."""
---> 25 return query(isbn, service) if isbn else {}
26
27
e:\Anaconda3\lib\site-packages\isbnlib\dev\_decorators.py in memoized_func(*args, **kwargs)
22 return cch[key]
23 else:
---> 24 value = func(*args, **kwargs)
25 if value:
26 cch[key] = value
e:\Anaconda3\lib\site-packages\isbnlib\_metadata.py in query(isbn, service)
18 if not ean:
19 LOGGER.critical('%s is not a valid ISBN', isbn)
---> 20 raise NotValidISBNError(isbn)
21 isbn = ean
22 # only import when needed
NotValidISBNError: (abc) is not a valid ISBN
没有看到代码很难回答,但 try/except 应该真的能够处理这个问题。
我不是这里的专家,但是看看这段代码:
l = [0, 1, "a", 2, 3]
for item in l:
try:
print(item + 1)
except TypeError as e:
print(item, "is not integer")
如果您尝试对字符串进行加法运算,python 会反对并使用 TypeError
退出。因此,您使用 except 捕获了 TypeError
并可能报告了一些相关信息。当我 运行 此代码时:
1
2
a is not integer # exception handled!
3
4
您应该能够使用 except NotValidISBNError
处理您的异常,然后报告您喜欢的任何元数据。
您可以通过异常处理变得更加复杂,但这是基本思想。
- 当前用于提取 isbn 元数据的实施非常缓慢且效率低下。
- 如前所述,有 482,000 个唯一的 isbn 值,其数据被多次下载(例如,每列一次,如代码当前所写)
- 最好一次下载所有元数据,然后从
dict
中提取数据作为单独的操作。 - A
try-except
块用于捕获来自无效 isbn 值的错误。- 返回空
dict
、{}
,因为pd.json_normalize
不能与NaN
或None
一起使用。 - 不需要分块 isbn 列。
- 返回空
pd.json_normalize
用于扩展.meta
返回的dict
。- 使用
pandas.DataFrame.rename
重命名列,使用pandas.DataFrame.drop
删除列。 - 此实现将比当前实现快得多,并且对用于获取元数据的 API 的请求将大大减少。
- 要从
lists
中提取值,例如'Authors'
列,请使用df_meta = df_meta.explode('Authors')
;如果有多位作者,列表中每多一位作者都会创建一个新行。
import pandas as pd # version 1.1.3
import isbnlib # version 3.10.3
# sample dataframe
df = pd.DataFrame({'isbn': ['9780446310789', 'abc', '9781491962299', '9781449355722']})
# function with try-except, for invalid isbn values
def get_meta(col: pd.Series) -> dict:
try:
return isbnlib.meta(col)
except isbnlib.NotValidISBNError:
return {}
# get the meta data for each isbn or an empty dict
df['meta'] = df.isbn.apply(get_meta)
# df
isbn meta
0 9780446310789 {'ISBN-13': '9780446310789', 'Title': 'To Kill A Mockingbird', 'Authors': ['Harper Lee'], 'Publisher': 'Grand Central Publishing', 'Year': '1988', 'Language': 'en'}
1 abc {}
2 9781491962299 {'ISBN-13': '9781491962299', 'Title': 'Hands-On Machine Learning With Scikit-Learn And TensorFlow - Techniques And Tools To Build Learning Machines', 'Authors': ['Aurélien Géron'], 'Publisher': "O'Reilly Media", 'Year': '2017', 'Language': 'en'}
3 9781449355722 {'ISBN-13': '9781449355722', 'Title': 'Learning Python', 'Authors': ['Mark Lutz'], 'Publisher': '', 'Year': '2013', 'Language': 'en'}
# extract all the dicts in the meta column
df = df.join(pd.json_normalize(df.meta)).drop(columns=['meta'])
# extract values from the lists in the Authors column
df = df.explode('Authors')
# df
isbn ISBN-13 Title Authors Publisher Year Language
0 9780446310789 9780446310789 To Kill A Mockingbird Harper Lee Grand Central Publishing 1988 en
1 abc NaN NaN NaN NaN NaN NaN
2 9781491962299 9781491962299 Hands-On Machine Learning With Scikit-Learn And TensorFlow - Techniques And Tools To Build Learning Machines Aurélien Géron OReilly Media 2017 en
3 9781449355722 9781449355722 Learning Python Mark Lutz 2013 en