Pandas запись словаря(значения - список) в csv
Всем здравствуйте, есть словарь содержащий в себе значения в виде списка, c ошибками, вида:
error = {'non_valid': [ ['наименование1', 'номер строки1'], ['наименование2', 'номер строки2'], []....]
'double': [ ['наименование1 с дубл.', 'строка с дубл. 1'], ['наименование2 с дубл.', 'строка с дубл. '], [].... ]
}
Количество ключей неизвестно, их может быть больше, меньше, или вообще словарь может быть пустым. Пытаюсь корректно записать в csv файл с помощью pandas - to_csv. Для записи преобразовываю словарь в dataframe, и записываю в csv
header = ['Файл', 'Строка']
# т.к длина значений может быть разная, чтобы pasndas не выдавал ошибку, заполню разницу nan
error = pd.DataFrame(dict([(k, pd.Series(v)) for k,v in error.items()]))
error_df = pd.DataFrame.from_dict(error)
error_df.to_csv(path_or_buf='csv_data.csv', encoding='utf-8-sig', header= header, index=False, sep=';')
А я бы хотел получить csv следующего вида:
т.е если бы были еще ключи со значениями, то они бы выводились после предыдущих.
Пока писал тему, возникла идея, создать пустой dataframe, и для словаря использовать вложенные циклы:
Но тут минус с использованием индексов, если в список со значениями добавиться еще элементы, то в цикле придется заново изменить индексы. Хотя я не понял как записать в столбец. Поискал, нашел .apply(lambda x:....., axis = 1) но все равно не понял(
У кого какие идеи? Может есть другой способ, без вложенных циклов? Если все же использовать вложенные циклы, то как структурировать все правильно. Также вопрос по поводу разной длины значений словаря, есть ли другой способ, кроме замены разницы на NaN. Код с вложенными циклами:
df = pd.DataFrame()
for i in error:
for j in error[i]:
df['file'] = j[0]
df['str_num'] = j[1]
Всем спасибо, решил вопрос с использованием дополнительного df и копии словаря, и большая часть вопросов заданных выше исчезла)
df = pd.DataFrame(columns= ['error_type', 'file', 'srt'])
error_copy = error.copy()
for i in error.items():
df_dictionary = pd.DataFrame(error_copy.pop(i[0]), columns= [ 'file', 'srt'])
df_dictionary['error_type'] = df_dictionary.apply(lambda row: i[0], axis=1)
df = pd.concat([df, df_dictionary], ignore_index=True)
df.to_csv(path_or_buf='csv_data.csv', encoding='utf-8-sig', index=False, sep=';')
Ответы (1 шт):
error = {'non_valid': [['наименование1', 'номер строки1'], ['наименование2', 'номер строки2']],
'double': [['наименование1 с дубл.', 'строка с дубл. 1'], ['наименование2 с дубл.', 'строка с дубл. ']]}
df = pd.DataFrame(error)
df1 = pd.concat([pd.DataFrame({'Файл': ['non_valid'], 'Строка': ['']}),
pd.DataFrame(df['non_valid'].to_list(), columns=['Файл', 'Строка'])])
df2 = pd.concat([pd.DataFrame({'Файл': ['double'], 'Строка': ['']}),
pd.DataFrame(df['double'].to_list(), columns=['Файл', 'Строка'])])
out = pd.concat([df1, df2])
out.to_csv(path_or_buf='csv_data.csv', encoding='utf-8-sig', index=False, sep=';')
csv_data.csv
Файл;Строка
non_valid;
наименование1;номер строки1
наименование2;номер строки2
double;
наименование1 с дубл.;строка с дубл. 1
наименование2 с дубл.;строка с дубл.

