这里有一个解决方案,无论具有不同键的字典还是包含字典和其他类型混合的列都可以工作。在
注意:我已经删除了请求的API密钥,您需要重新添加它。在from functools import partial
import itertools
import pandas as pd
import requests as rq
api_key = ""
url = "https://api.tfl.gov.uk/Road/A2%2C%20A406%2C%20A1%2C%20A12%2C%20A13/Disruption?app_id= XXXXXX&app_key={}".format(api_key)
r = rq.get(url)
r = r.text
df7 = pd.read_json(r)
output_path = "disruptions.csv"
def keys_if_dict(element):
if isinstance(element, dict):
return list(element.keys())
return list()
def value_for_key(element, key):
if isinstance(element, dict) and key in element:
return element[key]
return None
def handle_dicts_in_column(df, column_name):
column = df[column_name]
if any(map(lambda x: isinstance(x, dict), column)):
# this column has dictionaries in it
column_dict_keys = set(itertools.chain.from_iterable(column.transform(keys_if_dict)))
for dict_key in column_dict_keys:
column_name_from_dict_key = "{}_{}".format(column_name, dict_key)
while column_name_from_dict_key in df.columns:
column_name_from_dict_key += "(dup)"
df[column_name_from_dict_key] = column.transform(partial(value_for_key, key=dict_key))
if any(map(lambda x: isinstance(x, dict), df[column_name_from_dict_key])):
handle_dicts_in_column(df, column_name_from_dict_key)
for column_name in df7.columns:
handle_dicts_in_column(df7, column_name)
df7.to_csv(output_path)