我们有以下数据框:
import pandas as pd
import numpy as np
import json
from json import JSONDecodeError
json_as_str_list = [
"[{'key1': 312, 'name': 'Simple name'}]",
"[{'key1': 981, 'name': 'Name n' quote'}]",
np.nan
]
d = {'json_as_str': json_as_str_list}
df = pd.DataFrame(data=d)
json_as_str
0 [{'key1': 312, 'name': 'Simple name'}]
1 [{'key1': 981, 'name': 'Name n' quote'}]
2 NaN
在导入json_as_str
列之后是一个字符串列表,但我希望它是JSON对象列表。我编写了一个函数,该函数应返回给定字符串的空JSON对象的列表或给定np.nan
的空列表:
def convert_to_JSON_helper(json_str):
if isinstance(json_str, str):
json_str = json_str.replace("'", '"')
try:
return json.loads(json_str)
except JSONDecodeError:
print(json_str)
return []
else:
return []
当前实现不处理字符串中的单引号(如数据框的第二行)。我应该如何修改该功能以使其按预期工作?
使用df['json_as_str'].apply(convert_to_JSON_helper)
时获得的当前输出:
0 [{'key1': 312, 'name': 'Simple name'}]
1 []
2 []
Name: json_as_str, dtype: object
我想要的输出:
0 [{'key1': 312, 'name': 'Simple name'}]
1 [{'key1': 981, 'name': 'Name n' quote'}]
2 []
Name: json_as_str, dtype: object
答案 0 :(得分:0)
问题不是函数,而是字符串。您键入了\
来引用单引号,但是它毫无用处,因为字符串中的单个\引用了以下字符(此处是引号),然后将其放入字符串中。演示:
>>> a = " a 'b' 'c\'d' "
>>> a
" a 'b' 'c'd' "
反斜杠刚刚在字符串中被吃掉了。
无论如何,您都不应尝试以一般方式转换引号。由于所有可能的极端情况,您将必须构建一个专用(且复杂)的解析器。因此,我的建议是您应该在数据框中插入正确的JSON字符串。
答案 1 :(得分:0)
这是将字符串(带有单个')转换为字典。
import ast
data = ast.literal_eval("{'a' : 12, 'c' : 'd'}")
print(data)
print(type(data))
输出
{'a': 12, 'c': 'd'}
<type 'dict'>