如何将字典附加到熊猫数据框?

Posted

技术标签:

【中文标题】如何将字典附加到熊猫数据框?【英文标题】: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 数据框的第一列

【问题讨论】:

【参考方案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 会自动处理空的数据框条目。

【讨论】:

以上是关于如何将字典附加到熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章

在循环中将字典附加到熊猫数据框

将列表中的字典追加到熊猫数据框

如何将关联的相邻熊猫数据框数据导出到字典中? [复制]

字典中的字典到熊猫数据框

如何将包含元组列表的字典中的字典转换为熊猫数据框

如何将嵌套字典转换为熊猫数据框?