[英]Create pandas dataframe from string
我可以轻松地从仅包含一个键值对的字符串构建pandas数据框。 例如:
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)
我收到以下错误:
raise JSONDecodeError("Extra data", s, end)
我知道string2不是有效的JSON。
我可以通过编程方式对string2进行哪些修改,以便可以将其转换为有效的JSON ,然后获得如下所示的数据帧输出:
| Country | Name |
|---------|------|
| USA | Ryan |
| Sweden | Sam |
| Brazil | Ralf |
错误说明了一切。 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])
中,实际上是将字典放入带有brackers []
的数组中。 这是因为pandas DataFrame接受数据数组。 在第一个示例中实际拥有的是一个项目,在这种情况下, df = pd.Series(dict1).to_frame().T
更有意义,或者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))
如果您从其他地方以您描述的怪异格式获取数据的可能性很小,则基于正则表达式的替换可以修复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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.