我正在做一个非常简单的事情:向数据库请求一些东西,这个给我一个[巨大的]字典。没关系,我喜欢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']):
正如您所看到的,我的数据框中还有另一个字典!我想要的是以有效的方式从“值”键中取值(事实上,我知道如何使用一个大的for语句来做,但请不要在python中)。
我尝试了res['results']['bindings']['values']
或res['results']['bindings'].values() (or .values)
之类的内容,以及df.values()['value'] = df.values()
等数据框上的其他内容,但它不起作用。
答案 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