如何将不同格式的字典普遍扁平化为数据帧?
How to universally flatten different formats of dictionaries into dataframes?
我有一个 API 响应对象,它 returns 不同的字典格式取决于系统的输入。
例如,有两种格式:
--------------------1-------------------- --------
{'0': {'cdate': '2019-09-11 22:29:17',
'email': 'z1@z1.com',
'phone': '',
'first_name': '',
'last_name': '',
'customer_acct_id': '0',
'customer_acct_name': '',
'segmentio_id': '',
'bounced_hard': '0',
'bounced_soft': '0',
'bounced_date': '0000-00-00',
'ip': '2130706433',
'ua': '',
'hash': '7b0a049140eff94348c501d6792761ba',
'socialdata_lastcheck': '0000-00-00 00:00:00',
'email_local': '',
'email_domain': '',
'sentcnt': '0',
'rating': '0',
'rating_tstamp': '0000-00-00',
'gravatar': '0',
'deleted': '0',
'anonymized': '0',
'adate': '0000-00-00 00:00:00',
'udate': '0000-00-00 00:00:00',
'edate': '0000-00-00 00:00:00',
'deleted_at': '0000-00-00 00:00:00',
'created_utc_timestamp': '2019-09-11 22:29:17',
'updated_utc_timestamp': '2019-09-11 22:29:17',
'id': '4184'},
'result_code': 0,
'result_message': 'The email z1@z1.com is in the system already, please edit that contact instead.',
'result_output': 'json'}
--------------------2------------------------ --------
{'subscriber_id': 4184,
'sendlast_should': 0,
'sendlast_did': 0,
'result_code': 1,
'result_message': 'Contact added',
'result_output': 'json'}
我可以将 1
第一种字典格式展平为数据框,如下所示:
df = pd.DataFrame(resp.json())
然而,当我返回格式 2
时,我得到错误:
ValueError: If using all scalar values, you must pass an index
为了解决这个问题,我尝试了 from_dict,read_json,DataFrame(resp.json())
但没有成功。
我是否可以将任何字典对象普遍地扁平化为数据框或至少测试不同的格式?
我的目标是从示例 1
中的键 'id'
或示例 2
中的 'subscriber_id'
中提取值。对实现这一目标的所有建议持开放态度。
我可以像这样从示例 1
中提取键 id
的值:
df = pd.DataFrame(resp.json())
if 'id' in df.index:
new['id'] = df.loc['id']['0']
试试下面的代码,希望这会有所帮助
{0:{'subscriber_id': 4184, # <-- Here add key
'sendlast_should': 0,
'sendlast_did': 0,
'result_code': 1,
'result_message': 'Contact added',
'result_output': 'json'}}
在第二个 json 中,您必须添加所有数据都具有价值的键。因此,该键将充当此数据的列 header。
输出将是:
0
result_code 1
result_message Contact added
result_output json
sendlast_did 0
sendlast_should 0
subscriber_id 4184
我有一个 API 响应对象,它 returns 不同的字典格式取决于系统的输入。
例如,有两种格式:
--------------------1-------------------- --------
{'0': {'cdate': '2019-09-11 22:29:17',
'email': 'z1@z1.com',
'phone': '',
'first_name': '',
'last_name': '',
'customer_acct_id': '0',
'customer_acct_name': '',
'segmentio_id': '',
'bounced_hard': '0',
'bounced_soft': '0',
'bounced_date': '0000-00-00',
'ip': '2130706433',
'ua': '',
'hash': '7b0a049140eff94348c501d6792761ba',
'socialdata_lastcheck': '0000-00-00 00:00:00',
'email_local': '',
'email_domain': '',
'sentcnt': '0',
'rating': '0',
'rating_tstamp': '0000-00-00',
'gravatar': '0',
'deleted': '0',
'anonymized': '0',
'adate': '0000-00-00 00:00:00',
'udate': '0000-00-00 00:00:00',
'edate': '0000-00-00 00:00:00',
'deleted_at': '0000-00-00 00:00:00',
'created_utc_timestamp': '2019-09-11 22:29:17',
'updated_utc_timestamp': '2019-09-11 22:29:17',
'id': '4184'},
'result_code': 0,
'result_message': 'The email z1@z1.com is in the system already, please edit that contact instead.',
'result_output': 'json'}
--------------------2------------------------ --------
{'subscriber_id': 4184,
'sendlast_should': 0,
'sendlast_did': 0,
'result_code': 1,
'result_message': 'Contact added',
'result_output': 'json'}
我可以将 1
第一种字典格式展平为数据框,如下所示:
df = pd.DataFrame(resp.json())
然而,当我返回格式 2
时,我得到错误:
ValueError: If using all scalar values, you must pass an index
为了解决这个问题,我尝试了 from_dict,read_json,DataFrame(resp.json())
但没有成功。
我是否可以将任何字典对象普遍地扁平化为数据框或至少测试不同的格式?
我的目标是从示例 1
中的键 'id'
或示例 2
中的 'subscriber_id'
中提取值。对实现这一目标的所有建议持开放态度。
我可以像这样从示例 1
中提取键 id
的值:
df = pd.DataFrame(resp.json())
if 'id' in df.index:
new['id'] = df.loc['id']['0']
试试下面的代码,希望这会有所帮助
{0:{'subscriber_id': 4184, # <-- Here add key
'sendlast_should': 0,
'sendlast_did': 0,
'result_code': 1,
'result_message': 'Contact added',
'result_output': 'json'}}
在第二个 json 中,您必须添加所有数据都具有价值的键。因此,该键将充当此数据的列 header。
输出将是:
0
result_code 1
result_message Contact added
result_output json
sendlast_did 0
sendlast_should 0
subscriber_id 4184