Я написал короткую рекурсивную функцию, которая возвращает серию или конкатенацию нескольких серий, если один из ключей в вашем дикте (например, category_2
) содержит список из нескольких диктов.
def expand(x):
if type(x) == dict:
return pd.Series(x)
elif type(x) == list:
return pd.concat([expand(i) for i in x])
Если я начну со словаря, который вы вставили в приведенном выше примере:
d = {'category_1': [{'a': '151',
'b': '116',
'c': '86'}],
'category_2': [{'d': '201',
'e': '211',
'f': '252'},
{'d': '-1',
'e': '-9',
'f': '-7'}],
'category_3': {'g': 'Valid',
'h': None,
'i': False,
'j': False},
'category_4': {'k': None,
'l': None,
'm': None,
'n': None}}
Тогда это всего лишь вопрос объединения всех серий, созданных рекурсивным методом, который я написал:
output = pd.concat([expand(value) for key, value in d.items()])
И объединение любых дублирующих индексов так, чтобы их элементы появлялись в одном ряду и разделялись запятыми.Я также преобразую ряд в df с одной строкой и несколькими столбцами:
output = pd.DataFrame(output.groupby(output.index).apply(lambda x: ','.join(x.astype(str)))).T
В результате получается кадр данных, который соответствует желаемому результату:
output
a b c d e f g h i j k l m n
0 151 116 86 201,-1 211,-9 252,-7 Valid None Invalid Invalid None None None None