从string创建pandas数据帧

时间:2018-05-24 02:41:15

标签: python json string dictionary dataframe

我可以轻松地从仅包含一个键值对的字符串构建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)

2 个答案:

答案 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)