从数据框列

时间:2017-09-25 13:03:48

标签: python pandas dictionary dataframe

我正在做一个非常简单的事情:向数据库请求一些东西,这个给我一个[巨大的]字典。没关系,我喜欢dictionnaries。但我不是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 ['results'] ['bindings'],columns = res ['head'] ['vars']): enter image description here

正如您所看到的,我的数据框中还有另一个字典!我想要的是以有效的方式从“值”键中取值(事实上,我知道如何使用一个大的for语句来做,但请不要在python中)。

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

2 个答案:

答案 0 :(得分: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时可能出现的问题。

答案 1 :(得分: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