我可以轻松地从仅包含一个键值对的字符串构建pandas数据帧。例如:
let storyBoard: UIStoryboard = UIStoryboard(name: "Test", bundle: nil)
let pdv = storyBoard.instantiateViewController(withIdentifier: "TabBarViewController") as! UITabBarViewController
self.present(pdv, animated: true, completion: nil)
但是,当我使用具有多个键值对的字符串时:
string1 = '{"Country":"USA","Name":"Ryan"}'
dict1 = json.loads(string1)
df=pd.DataFrame([dict1])
print(df)
我收到以下错误:
string2 = '{"Country":"USA","Name":"Ryan"}{"Country":"Sweden","Name":"Sam"}{"Country":"Brazil","Name":"Ralf"}'
dict2 = json.loads(string2)
我知道string2不是有效的JSON。
我可以对string2 以编程方式进行哪些修改,以便我可以将其转换为有效的JSON ,然后获取数据帧输出,如下所示:
raise JSONDecodeError("Extra data", s, end)
答案 0 :(得分:4)
错误说明了一切。 JSON无效。你在哪里得到那个string2?你在自己打字吗?
在这种情况下,您应该使用括号[]
包围项目,并使用逗号,
分隔项目。
工作示例:
import pandas as pd
import json
string2 = '[{"Country":"USA","Name":"Ryan"},{"Country":"Sweden","Name":"Sam"},{"Country":"Brazil","Name":"Ralf"}]'
df = pd.DataFrame(json.loads(string2))
print(df)
返回:
Country Name
0 USA Ryan
1 Sweden Sam
2 Brazil Ralf
有趣的是,如果你是额外的观察者,在这一行df=pd.DataFrame([dict1])
中,你实际上是将你的字典放在一个带有分析符[]
的数组中。这是因为pandas DataFrame接受数据数组。你在第一个例子中实际拥有的是一个项目,在这种情况下,一个系列会更有意义或df = pd.Series(dict1).to_frame().T
。
或者:
string1 = '[{"Country":"USA","Name":"Ryan"}]' # <--- brackets here to read json as arr
dict1 = json.loads(string1)
df=pd.DataFrame(dict1)
print(df)
如果您理解这一点,我认为我们更容易理解我们需要,
来分离元素。
但是,假设您自己正在创建此数据集,那么您可以继续执行此操作:
data = [("USA","Ryan"),("Sweden","Sam"),("Brazil","Ralf")]
dict1 = [{"Country":i, "Name":y} for i,y in data] # <-- dictionaries inside arr
df = pd.DataFrame(dict1)
或者:
data = [("USA","Ryan"),("Sweden","Sam"),("Brazil","Ralf")]
df = pd.DataFrame(dict1, columns=['Country','Name'])
或者我更喜欢使用CSV结构:
data = '''\
Country,Name
USA,Ryan
Sweden,Sam
Brazil,Ralf'''
df = pd.read_csv(pd.compat.StringIO(data))
答案 1 :(得分:1)
如果您从其他地方以您描述的奇怪格式获取数据,那么遵循基于正则表达式的替换可以修复您的json,然后按照@Anton vBR的解决方案进行操作。
import pandas as pd
import json
import re
string2 = '{"Country":"USA","Name":"Ryan"}{"Country":"Sweden","Name":"Sam"}{"Country":"Brazil","Name":"Ralf"}'
#create dict of substitutions
rd = { '^{' : '[{' , #substitute starting char with [
'}$' : '}]', #substitute ending char with ]
'}{' : '},{' #Add , in between two dicts
}
#replace as per dict
for k,v in rd.iteritems():
string2 = re.sub(r'{}'.format(k),r'{}'.format(v),string2)
df = pd.DataFrame(json.loads(string2))
print(df)