Я не знаю функцию панды, которая может преобразовать этот тип словаря в нужный словарь.Вы должны создать промежуточный словарь, который можно передать фабрике DataFrame и после их объединения.
Следующий код должен помочь:
dictionary = [{
'vendor': 'vendor1',
'option_list': [{
'col1_name': 'Column1',
'col1_options': ['option1', 'option2', 'option3']
}, {
'col2_name': 'Column2',
'col2_options': ['small']
}, {
'col3_name': 'Column3',
'col3_options': ['yellow', 'black', 'green']
}
]
}, {
'vendor': 'vendor2',
'option_list': [{
'col1_name': 'Column1',
'col1_options': ['option3']
}, {
'col2_name': 'Column2',
'col2_options': ['small', 'medium', 'large']
}, {
'col3_name': 'Column3',
'col3_options': ['yellow', 'green']
}
]
}]
to_concat = []
for one_vendor_dict in dictionary:
new_option_dict = {}
for option_dict in one_vendor_dict['option_list']:
column_name, option_value = None, None
# get column name and column values
for k, v in option_dict.items():
if 'name' in k:
column_name = v
if 'options' in k:
option_value = v
if column_name and option_value:
new_option_dict[column_name] = option_value
# put all list to same length in order to build a dataframe.
max_length = max([len(v) for v in new_option_dict.values()])
for k, v in new_option_dict.items():
if len(v) < max_length:
new_option_dict.update({k: v + [None] * (max_length - len(v))})
# add the vendor column
new_option_dict.update({'Vendor': [one_vendor_dict['vendor']] * max_length})
# create a dataframe for this vendor
to_concat.append(pd.DataFrame(new_option_dict))
df = pd.concat(to_concat).reset_index(drop=True)
Этот вывод:
Column1 Column2 Column3 Vendor
0 option1 small yellow vendor1
1 option2 None black vendor1
2 option3 None green vendor1
3 option3 small yellow vendor2
4 None medium green vendor2
5 None large None vendor2
Если у вас есть больше столбцов для одного поставщика, функция concat
будет заполнена None
или NaN
при объединении.
Я использую None
, потому что опции - это строки, но этокорректно определяется функцией isna
при необходимости после.