Python 如何将字典附加到数据帧?
我有一组包含json文件的URL和一个空数据框,其中的列表示jsnon文件的属性。并非所有json文件都具有数据帧中的所有属性。我需要做的是从json文件中创建字典,然后将每个字典作为新行附加到pandas数据框中,如果json文件没有与数据框中的列匹配的属性,则必须将其填充为空 我设法创建了以下词典:Python 如何将字典附加到数据帧?,python,json,for-loop,dictionary,pandas,Python,Json,For Loop,Dictionary,Pandas,我有一组包含json文件的URL和一个空数据框,其中的列表示jsnon文件的属性。并非所有json文件都具有数据帧中的所有属性。我需要做的是从json文件中创建字典,然后将每个字典作为新行附加到pandas数据框中,如果json文件没有与数据框中的列匹配的属性,则必须将其填充为空 我设法创建了以下词典: import urllib2 import json url = "https://cws01.worldstores.co.uk/api/product.php?product_sku=
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']是熊猫数据帧的第一列,以下代码适用于我:
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]
假设
df
为空且与url字典键具有相同的列,则.loc()
中的参数顺序是混合的,并且具有一对多的[]
list(df)
#[u'alternate_product_code',
# u'availability',
# u'boz',
# ...
len(df)
#0
然后你可以用
不太确定为什么你的代码不能工作,但是考虑下面的一些编辑,它应该清理事情,如果你还想使用它:
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
我曾经迭代links数组的索引和值,这样就不需要索引计数器(
行
,在代码中),然后我使用.items
字典方法,这样我就可以一次迭代键和值。我相信pandas会自动处理空数据框条目。它给了我这个错误:other=np.array(other,dtype='i8')ValueError:long的文本无效(),以10为基数:“2015-05-28 16:31:19”在我的代码中,我用dtype='str'定义了df。
从错误中,我假设您的一些列是int,所以你不能在那里存储文本。尝试将df列定义为str,并在加载数据后使用类型进行操作。
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