2 回答
TA贡献1818条经验 获得超8个赞
当前提取 isbn 元数据的实现速度极其缓慢且效率低下。
如前所述,有 482,000 个唯一的 isbn 值,其数据被多次下载(例如,每列一次,因为当前编写的代码)
最好一次性下载所有元数据,然后从 中提取数据
dict
,作为单独的操作。块
try-except
用于捕获无效 isbn 值的错误。返回一个空的
dict
, ,因为不能与或 一起使用。{}
pd.json_normalize
NaN
None
没有必要对 isbn 列进行分块。
pd.json_normalize
用于扩展dict
from 返回的值.meta
。用于
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
TA贡献1805条经验 获得超10个赞
如果没有看到代码,很难回答,但是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. 因此,您捕获了TypeErrorexcept 的使用,并可能报告有关它的一些内容。当我运行这段代码时:
1
2
a is not integer # exception handled!
3
4
您应该能够使用 处理异常except NotValidISBNError,然后报告您喜欢的任何元数据。
您可以通过异常处理变得更加复杂,但这是基本思想。
添加回答
举报