繁体   English   中英

从字符串创建熊猫数据框

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM