Mat*_* W. 4 python salesforce ordereddictionary soql pandas
我正在尝试使用simple_salesforcepython中的包查询salesforce中的信息.
问题是,它是一个嵌套字段,它是父子关系的一部分,成为有序字典中的有序字典
我想要从Opportunity对象中找到id,以及与该记录关联的accountid.
SOQL查询可能看起来像......
query = "select id, account.id from opportunity where closedate = last_n_days:5"
Run Code Online (Sandbox Code Playgroud)
在SOQL(salesforce对象查询语言)中,点表示数据库中的父子关系.所以我试图从机会对象获取id,然后从该记录上的帐户对象获取相关的id.
出于某种原因,Id很好,但是account.id嵌套在有序字典中的有序字典中:
q = sf.query_all(query)
Run Code Online (Sandbox Code Playgroud)
这会拉回一个有序的字典..
OrderedDict([('totalSize', 455),
('done', True),
('records',
[OrderedDict([('attributes',
OrderedDict([('type', 'Opportunity'),
('url',
Run Code Online (Sandbox Code Playgroud)
我会拉records一块ordereddict来创造一个df
df = pd.DataFrame(q['records'])
Run Code Online (Sandbox Code Playgroud)
这给了我3列,一个有序的dict调用'attributes',Id另一个有序的dict调用'Account'.我正在寻找一种('BillingCountry', 'United States')从嵌套的有序字典中提取出来的方法'Account'
[OrderedDict([('attributes',
OrderedDict([('type', 'Opportunity'),
('url',
'/services/data/v34.0/sobjects/Opportunity/0061B003451RhZgiHHF')])),
('Id', '0061B003451RhZgiHHF'),
('Account',
OrderedDict([('attributes',
OrderedDict([('type', 'Account'),
('url',
'/services/data/v34.0/sobjects/Account/001304300MviPPF3Z')])),
('BillingCountry', 'United States')]))])
Run Code Online (Sandbox Code Playgroud)
编辑:澄清我在寻找什么.
我希望以一个数据框结束,每个查询字段都有一列.
当我'records'使用df = pd.DataFrame(sf.query_all(query)['records'])它将片段放入DataFrame时,它给了我:
attributes Id Account
OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B003451RhZgiHHF')]) 0061B003451RhZgiHHF OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0013000000MvkRQQAZ')])), ('BillingCountry', 'United States')])
OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B00001Pa52QQAR')]) 0061B00001Pa52QQAR OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0011300001vQPxqAAG')])), ('BillingCountry', 'United States')])
OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B00001TRu5mQAD')]) 0061B00001TRu5mQAD OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0011300001rfRTrAAE')])), ('BillingCountry', 'United States')])
Run Code Online (Sandbox Code Playgroud)
删除'attributes'列后我想要输出
Id BillingCountry
0061B003451RhZgiHHF 'United States'
0061B00001Pa52QQAR 'United States'
0061B00001TRu5mQAD 'United States'
Run Code Online (Sandbox Code Playgroud)
Pandas是表格数据的一个神奇工具.但它虽然可以包含Python对象,但这不是它的最佳点.我建议您在将查询数据插入以下内容之前从查询中提取数据pandas.Dataframe:
要将所需字段作为字典列表提取,就像以下一样简单:
records = [dict(id=rec['Id'], country=rec['Account']['BillingCountry'])
for rec in data['records']]
Run Code Online (Sandbox Code Playgroud)
使用dicts列表,数据帧就像以下一样简单:
df = pd.DataFrame(records)
Run Code Online (Sandbox Code Playgroud)
import pandas as pd
from collections import OrderedDict
data = OrderedDict([
('totalSize', 455),
('done', True),
('records', [
OrderedDict([
('attributes', OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B003451RhZgiHHF')])),
('Id', '0061B003451RhZgiHHF'),
('Account', OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0013000000MvkRQQAZ')])),
('BillingCountry', 'United States')])),
]),
OrderedDict([
('attributes', OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B00001Pa52QQAR')])),
('Id', '0061B00001Pa52QQAR'),
('Account', OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0011300001vQPxqAAG')])),
('BillingCountry', 'United States')])),
]),
OrderedDict([
('attributes', OrderedDict([('type', 'Opportunity'), ('url', '/services/data/v34.0/sobjects/Opportunity/0061B00001TRu5mQAD')])),
('Id', '0061B00001TRu5mQAD'),
('Account', OrderedDict([('attributes', OrderedDict([('type', 'Account'), ('url', '/services/data/v34.0/sobjects/Account/0011300001rfRTrAAE')])),
('BillingCountry', 'United States')])),
]),
])
])
records = [dict(id=rec['Id'], country=rec['Account']['BillingCountry'])
for rec in data['records']]
for r in records:
print(r)
print(pd.DataFrame(records))
Run Code Online (Sandbox Code Playgroud)
{'country': 'United States', 'id': '0061B003451RhZgiHHF'}
{'country': 'United States', 'id': '0061B00001Pa52QQAR'}
{'country': 'United States', 'id': '0061B00001TRu5mQAD'}
country id
0 United States 0061B003451RhZgiHHF
1 United States 0061B00001Pa52QQAR
2 United States 0061B00001TRu5mQAD
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1124 次 |
| 最近记录: |