【问题标题】:How to append a dictionary to a pandas dataframe?如何将字典附加到熊猫数据框?
【发布时间】:2015-10-20 02:50:59
【问题描述】:

我有一组包含 json 文件的 url 和一个空的 pandas 数据框,其中的列表示 jsnon 文件的属性。并非所有 json 文件都具有 pandas 数据框中的所有属性。我需要做的是从 json 文件中创建字典,然后将每个字典作为新行附加到 pandas 数据帧,如果 json 文件没有与数据帧中的列匹配的属性,则必须是填空。

我设法将字典创建为:

import urllib2
import json  

url = "https://cws01.worldstores.co.uk/api/product.php?product_sku=ULST:7BIS01CF"
data = urllib2.urlopen(url).read()
data = json.loads(data)

然后我尝试如下创建一个for循环:

row = -1
for i in links:
    row = row + 1
    data = urllib2.urlopen(str(i)).read()
    data = json.loads(data)
    for key in data.keys():
        for column in df.columns:
            if str(column) == str(key):
                df.loc[[str(column)],row] = data[str(key)]
            else:
                df.loc[[str(column)],row] = None

其中 df 是数据框,links 是一组 url

但是,我收到以下错误:

raise KeyError('%s not in index' % objarr[mask])

KeyError: "['2_seater_depth_mm'] not in index"

其中 ['2_seater_depth_mm'] 是 pandas 数据框的第一列

【问题讨论】:

    标签: python json for-loop dictionary pandas


    【解决方案1】:

    对我来说,下面的代码有效:

    row = -1
    for i in links:
        row = row + 1
        data = urllib2.urlopen(str(i)).read()
        data = json.loads(data)
        for key in data.keys():
            df.loc[row,key] = data[key]
    

    .loc() 中的参数顺序不同,[] 中的参数顺序是一对多

    【讨论】:

    • 它给了我这个错误: other = np.array(other, dtype='i8') ValueError: invalid literal for long() with base 10: '2015-05-28 16:31: 19'
    • 在我的代码中,我用dtype='str' 定义了 df 从错误中我假设你的一些列是整数,所以你不能在那里存储文本。尝试将 df 列定义为 str 并在加载数据后使用类型进行操作。
    【解决方案2】:

    假设df 为空并且与 url 字典键具有相同的列,即

    list(df)
    #[u'alternate_product_code',
    # u'availability',
    # u'boz',
    # ...
    
    len(df)
    #0
    

    那么你可以使用pandas.append

    for url in links:
        url_data = urllib2.urlopen(str(url)).read()
        url_dict = json.loads(url_data)
        a_dict   = { k:pandas.Series([str(v)], index=[0]) for k,v in url_dict.iteritems() }
        new_df = pandas.DataFrame.from_dict(a_dict)
        df.append(new_df, ignore_index=True)
    

    不太清楚为什么您的代码不起作用,但如果您仍想使用它,请考虑以下一些应该清理内容的编辑:

    for row,url in enumerate(links):
        data      = urllib2.urlopen(str(url)).read()
        data_dict = json.loads(data)
        for key,val in data_dict.items():
            if key in list(df):
                df.ix[row,key] = val
    

    我使用enumerate 来迭代链接数组的索引和值,这样你就不需要索引计数器(代码中的row)然后我使用了.items 字典方法,所以我可以一次迭代键和值。我相信 pandas 会自动处理空的数据框条目。

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2017-10-12
      • 2020-09-23
      • 2018-02-08
      • 2017-06-13
      • 2014-01-03
      • 1970-01-01
      • 2016-10-17
      • 2017-08-02
      相关资源
      最近更新 更多