Написать список словаря в CSV Python
Предположим, у меня есть список набора словарных данных, как это,
data_set = [
{'Active rate': [0.98, 0.97, 0.96]},
{'Operating Expense': [3.104, 3.102, 3.101]}
]
мне нужно повторить список словаря и поместить ключи в качестве заголовков столбцов и его значения в качестве строк и записать его в файл CSV.
Active rate Operating Expense
0.98 3.104
0.97 3.102
0.96 3.101
Это то, что я пробовал
data_set = [
{'Active rate': [0.98, 0.931588, 0.941192]},
{'Operating Expense': [3.104, 2.352, 2.304]}
]
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['Active rate', 'Operating Expense']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Active rate': 0.98, 'Operating Expense': 3.102})
writer.writerow({'Active rate': 0.97, 'Operating Expense': 3.11})
writer.writerow({'Active rate': 0.96, 'Operating Expense': 3.109})
для краткости я уменьшил ключи до 2 и список значений до 3.
как подойти к этой проблеме?
спасибо
5 ответов
data_set = [ {'Active rate': [0.98, 0.97, 0.96]}, {'Operating Expense': [3.104, 3.102, 3.101]} ]
во-первых, просто быстрый комментарий, ваша начальная структура данных не обязательно имеет смысл, как есть. Вы используете список диктов, но каждый дикт, кажется, использует только один ключ, который, кажется, побеждает его цель.
другие структуры данных, которые имели бы больше смысла, были бы примерно такими (где каждая структура dict используется, как у вас в настоящее время, для одной пары метка/значение, но, по крайней мере, dict используется для указания метки и значение):
data_set = [
{'label': 'Active rate', 'values': [0.98, 0.97, 0.96]},
{'label': 'Operating Expense', 'values': [3.104, 3.102, 3.101]}
]
или, возможно, лучше,OrderedDict
которые дают вам как порядок вашего начального набора данных, так и преимущества сопоставления ключа / значения:
from collections import OrderedDict
data_set = OrderedDict()
data_set['Active rate'] = [0.98, 0.97, 0.96]
data_set['Operating Expense'] = [3.104, 3.102, 3.101]
конечно, мы не всегда выбираем структуры данных, которые получаем, поэтому предположим, что вы не можете их изменить. Затем ваш вопрос становится проблемой замены ролей строк и столбцов из исходного набора данных. Фактически, вы хотите перебирать несколько списков одновременно, и для этого, zip
очень полезно.
import csv
fieldnames = []
val_lists = []
for d in data_set:
# Find the only used key.
# This is a bit awkward because of the initial data structure.
k = d.keys()[0]
fieldnames.append(k)
val_lists.append(d[k])
with open('names.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(fieldnames)
for row in zip(*val_lists):
# This picks one item from each list and builds a list.
# The first row will be [0.98, 3.104]
# The second row will be [0.97, 3.102]
# ...
writer.writerow(row)
обратите внимание, что нет необходимости DictWriter
когда вы используете zip
, так как это означало бы, что вам нужно перестроить dict без какой-либо реальной выгоды.
d1 = {'Active rate': [0.98, 0.931588, 0.941192]}
d2 = {'Operating Expense': [3.104, 2.352, 2.304]}
with open('names.csv', 'w') as csvfile:
fieldnames = zip(d1, d2)[0]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for row in zip(d1['Active rate'], d2['Operating Expense']):
writer.writerow(dict(zip(fieldnames, row)))
для производительности вы можете использовать itertools.izip
над zip
в зависимости от длины списков.
следующий подход должен работать для структуры данных, которые вы дали:
import csv
data_set = [
{'Active rate': [0.98, 0.97, 0.96]},
{'Operating Expense': [3.104, 3.102, 3.101]}
]
fieldnames = ['Active rate', 'Operating Expense']
rows = []
for field in fieldnames:
for data in data_set:
try:
rows.append(data[field])
break
except KeyError, e:
pass
with open('names.csv', 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(fieldnames)
csv_output.writerows(zip(*rows))
предоставление вам следующего выходного файла CSV:
Active rate,Operating Expense
0.98,3.104
0.97,3.102
0.96,3.101
(этот ответ имеет недостаток использования внешней библиотеки, но)
pandas
уже предоставляет чрезвычайно мощные и простые инструменты для работы с csv-файлами. Вы можете использовать to_csv
.
обратите внимание, что ваша структура данных структурирована неуклюже, поэтому мы сначала преобразуем ее в более интуитивную структуру
data_set2 = { x.keys()[0] : x.values()[0] for x in data_set }
import pandas as pd
df = pd.DataFrame(data_set2)
df.to_csv('names.csv', index = False)
этот код поможет вам без привязки к определенному количеству диктов внутри data_set
я добавил еще один дикт с ключом "потери", чтобы проверить
import csv
data_set = [
{'Active rate': [0.98, 0.97, 0.96]},
{'Operating Expense': [3.104, 3.102, 3.101]},
{'Losses': [1.14, 2.28, 3.42]}
]
headers = [d.keys()[0] for d in data_set]
with open('names.csv', 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=headers)
writer.writeheader()
for item in zip(*[x.values()[0] for x in data_set]):
more_results = list()
more_results.append(headers)
more_results.append(item)
writer.writerow(dict(zip(*more_results)))
выход: