2017-09-25 62 views
0

我正在处理一件非常简单的事情:向数据库请求某个东西,这个东西正在返回一个[巨大]字典。没关系,我爱字典。但我不是一个在Python这个东西的专业人士。从数据帧列中的字典中提取值

我的问题是,我想将这个字典转换成一个DataFrame。没关系,我使用了它并且它可以工作。但在我的字典中,我有其他字典(是的,我知道...)。

我想从这些字典(这是在我的数据帧)采取了“价值”键

的值下面是一个样本,是我的尝试。提前致谢。

[RES是我巨大的字典,从查询结果]

RES:

{'head': {'vars': ['id', 'marque', 'modele']}, 
'results': {'bindings': [{'id': {'type': 'literal', 'value': '1362'}, 
    'marque': {'type': 'literal', 'value': 'PEUGEOT'}, 
    'modele': {'type': 'literal', 'value': '206'}},.... 

pd.DataFrame(RES [ '结果'] [ '绑定'正如你所看到的,我的数据框还有另外一本词典!我想要的是以有效的方式从“价值”键中取值,(我确实知道如何使用大的for语句来做到这一点,但请不要使用python)。

我尝试了诸如res['results']['bindings']['values']res['results']['bindings'].values() (or .values)之类的东西,以及数据框上的其他东西,如df.values()['value'] = df.values(),但它不起作用。

回答

2

IIUC,您可以使用applymap并从每个字典中提取与value密钥关联的值。

import operator 

df = pd.DataFrame(res['results']['bindings'], columns=res['head']['vars']) 
df = df.applymap(operator.itemgetter('value')) 

这是在假定每个单元格值是字典的情况下运行的。


,便有可能你的一些词典不包含value作为重点。在这种情况下,轻微的修改,要求使用dict.get

df = df.applymap(lambda x: x.get('value', np.nan) \ 
         if isinstance(x, dict) else np.nan) 

这也将处理出现的时候x不是dict的潜在问题。

+0

它的工作原理。这非常有效。谢谢 ! :)Clément 编辑:谢谢你对你的答案的第二部分的建议,它是有用的,是的,它可以发生。 –

+0

@ClementB很高兴帮助。 –

2

您可以使用json_normalize其完美补充NaN S:

d = {'head': {'vars': ['id', 'marque', 'modele']}, 
'results': {'bindings': [{'id': {'type': 'literal', 'value': '1362'}, 
    'marque': {'type': 'literal', 'value': 'PEUGEOT'}, 
    'modele': {'type': 'literal', 'value': '206'}},{'id': {'type': 'literal', 'value': '1362'}, 
    'marque': {'type': 'literal', 'value': 'PEUGEOT'}}]}} 

from pandas.io.json import json_normalize  
df = json_normalize(d['results']['bindings']).filter(like='value') 
df.columns = df.columns.str.replace('.value','') 
print (df) 
    id marque modele 
0 1362 PEUGEOT 206 
1 1362 PEUGEOT NaN 
+0

谢谢你。 –