如何从 pandas.df 的选定行开始 for 循环?
how to start a for loop from a chosen row of pandas.df?
在使用 loop.I 处理 pandas.df 时通常会遇到错误。消除错误后,我将不得不从数据帧的开头重新启动 for 循环。我怎样才能从错误位置开始 for 循环,反复摆脱 运行 它。
例如:
senti = []
for i in dfs['ssentence']:
senti.append(get_baidu_senti(i))
在上面的代码中,我试图通过api进行情感分析并将它们存储到list.However中,api仅输入GBK格式,而我的数据是以utf-8编码。所以它通常会遇到这样的错误:
UnicodeEncodeError: 'gbk' codec can't encode character '\u30fb' in position 14: illegal multibyte sequence
所以我必须手动删除'\u30fb'之类的特定项目并重新启动for循环。此时,列表"senti" 已经包含了很多数据,所以我不想放弃它们。我可以做些什么来改进 for 循环?
如果您 API 需要编码为 GBK,那么只需使用 'strict'
(默认)以外的错误处理程序编码为该编解码器。
'ignore'
将丢弃任何无法编码为 GBK 的代码点:
dfs['ssentence_encoded'] = dfs['ssentence'].str.encode('gbk', 'ignore')
参见Error Handlers section of Python's codecs
documentation。
如果您需要传入字符串,但只传入可以安全编码为 GBK 的字符串,那么我会创建一个适合 str.translate()
method:
的翻译映射
class InvalidForEncodingMap(dict):
def __init__(self, encoding):
self._encoding = encoding
self._negative = set()
def __missing__(self, codepoint):
if codepoint in self._negative:
raise LookupError(codepoint)
if chr(codepoint).encode(self._encoding, 'ignore'):
# can be mapped, record as a negative and raise
self._negative.add(codepoint)
raise LookupError(codepoint)
# map to None to remove
self[codepoint] = None
return None
only_gbk = InvalidForEncodingMap('gbk')
dfs['ssentence_gbk_safe'] = dfs['sentence'].str.translate(only_gbk)
InvalidForEncodingMap
class 会在查找代码点时延迟创建条目,因此只会处理数据中实际存在的代码点。如果您需要多次使用它,我仍然会保留地图实例以供重复使用,它建立的缓存可以通过这种方式重复使用。
在使用 loop.I 处理 pandas.df 时通常会遇到错误。消除错误后,我将不得不从数据帧的开头重新启动 for 循环。我怎样才能从错误位置开始 for 循环,反复摆脱 运行 它。 例如:
senti = []
for i in dfs['ssentence']:
senti.append(get_baidu_senti(i))
在上面的代码中,我试图通过api进行情感分析并将它们存储到list.However中,api仅输入GBK格式,而我的数据是以utf-8编码。所以它通常会遇到这样的错误:
UnicodeEncodeError: 'gbk' codec can't encode character '\u30fb' in position 14: illegal multibyte sequence
所以我必须手动删除'\u30fb'之类的特定项目并重新启动for循环。此时,列表"senti" 已经包含了很多数据,所以我不想放弃它们。我可以做些什么来改进 for 循环?
如果您 API 需要编码为 GBK,那么只需使用 'strict'
(默认)以外的错误处理程序编码为该编解码器。
'ignore'
将丢弃任何无法编码为 GBK 的代码点:
dfs['ssentence_encoded'] = dfs['ssentence'].str.encode('gbk', 'ignore')
参见Error Handlers section of Python's codecs
documentation。
如果您需要传入字符串,但只传入可以安全编码为 GBK 的字符串,那么我会创建一个适合 str.translate()
method:
class InvalidForEncodingMap(dict):
def __init__(self, encoding):
self._encoding = encoding
self._negative = set()
def __missing__(self, codepoint):
if codepoint in self._negative:
raise LookupError(codepoint)
if chr(codepoint).encode(self._encoding, 'ignore'):
# can be mapped, record as a negative and raise
self._negative.add(codepoint)
raise LookupError(codepoint)
# map to None to remove
self[codepoint] = None
return None
only_gbk = InvalidForEncodingMap('gbk')
dfs['ssentence_gbk_safe'] = dfs['sentence'].str.translate(only_gbk)
InvalidForEncodingMap
class 会在查找代码点时延迟创建条目,因此只会处理数据中实际存在的代码点。如果您需要多次使用它,我仍然会保留地图实例以供重复使用,它建立的缓存可以通过这种方式重复使用。