Python 从dataframe列中的字典中提取值
我正在做一件非常简单的事情:向数据库请求一些东西,这件事会给我一本[巨大的]字典。没关系,我喜欢演讲。但我不是Python方面的专家 我的问题是我想把这个字典转换成一个数据帧。没关系,我在谷歌上搜索了一下,效果不错。但是在我的字典里,我有其他的字典(是的,我知道…) 我想从那些字典(它们进入我的数据帧)中获取“value”键的值 这是一个样本和我试过的。谢谢,这是事先准备好的 [[res是我的大字典,是查询的结果]] res:Python 从dataframe列中的字典中提取值,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,Dataframe,我正在做一件非常简单的事情:向数据库请求一些东西,这件事会给我一本[巨大的]字典。没关系,我喜欢演讲。但我不是Python方面的专家 我的问题是我想把这个字典转换成一个数据帧。没关系,我在谷歌上搜索了一下,效果不错。但是在我的字典里,我有其他的字典(是的,我知道…) 我想从那些字典(它们进入我的数据帧)中获取“value”键的值 这是一个样本和我试过的。谢谢,这是事先准备好的 [[res是我的大字典,是查询的结果]] res: {'head': {'vars': ['id', 'marque',
{'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']):
如您所见,我的数据框中还有另一本字典!我想要的是以一种有效的方式从“value”键获取值(事实上,我知道如何使用big for语句来实现这一点,但请不要使用python)
我尝试了
res['results']['bindings']['values']
,或res['results']['bindings'].values()(或.values)
,以及数据框架上的其他东西,如df.values()['value']=df.values()
,但它不起作用。IIUC,您可以使用applymap
并从每个字典中提取与value
键关联的值
import operator
df = pd.DataFrame(res['results']['bindings'], columns=res['head']['vars'])
df = df.applymap(operator.itemgetter('value'))
这是在假设每个单元格值都是字典的情况下操作的
您的某些词典可能不包含
值
作为键。在这种情况下,需要使用dict.get
:
df = df.applymap(lambda x: x.get('value', np.nan) \
if isinstance(x, dict) else np.nan)
这也将处理当
x
不是dict
IIUC时出现的潜在问题,您可以使用applymap
并从每个字典中提取与value
键相关的值
import operator
df = pd.DataFrame(res['results']['bindings'], columns=res['head']['vars'])
df = df.applymap(operator.itemgetter('value'))
这是在假设每个单元格值都是字典的情况下操作的
您的某些词典可能不包含
值
作为键。在这种情况下,需要使用dict.get
:
df = df.applymap(lambda x: x.get('value', np.nan) \
if isinstance(x, dict) else np.nan)
这还将处理当x
不是dict
时出现的潜在问题,您可以使用它完美地添加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'}}]}}
您可以使用以下选项完美地添加
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'}}]}}
它起作用了。而且效率很高。谢谢!:)Clément Edit:谢谢你对答案第二部分的建议,它是有用的,是的,它可以发生。@ClementB很高兴它有帮助。它很有效。而且效率很高。谢谢!:)Clément Edit:谢谢你对答案第二部分的建议,它是有用的,是的,它可以发生。@ClementB很高兴它有帮助。