【问题标题】:Create pandas dataframe from string从字符串创建熊猫数据框
【发布时间】:2018-11-03 03:18:16
【问题描述】:

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

【问题讨论】:

    标签: python json string dictionary dataframe


    【解决方案1】:

    你的错误

    错误说明了一切。 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))
    

    【讨论】:

      【解决方案2】:

      如果您从其他地方以您描述的奇怪格式获取数据,则遵循基于正则表达式的替换可以修复您的 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)
      

      【讨论】:

        猜你喜欢
        • 2021-12-24
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2016-01-14
        • 2017-02-24
        • 2019-04-16
        • 1970-01-01
        相关资源
        最近更新 更多