Есть ли более питонический способ распределить содержимое нескольких списков по полям в нескольких структурах? Пример ниже с использованием pandas.dataframe
import pandas
# INPUT
files = ['file1.csv','file2.csv','file3.csv','file4.csv', 'file5.csv']
names = ['Cold', 'Hot','Hotter','Hottest','Hottestest']
lines = ['-','-',':','-',':']
colors = ['b','r','r','y','y']
marker = ['','','','o','']
cases = []
for idx,case in enumerate(files):
cases.append(pandas.read_csv(fname))
cases[idx].name = names[idx]
cases[idx].color = colors[idx]
cases[idx].marker = marker[idx]
cases[idx].lines = lines[idx]
Обновлено: Используя Адриан ответ, мы можем упростить это, используя assign
и **kwargs
:
import pandas
# INPUT
file_map = {
'file1.csv': {
'name': 'Cold',
'lines': '-',
'colors': 'b',
'marker': ''
},
# ...etc...
}
cases = []
for filename, attrs in file_map.iteritems():
cases.append(pandas.read_csv(filename).assign(**attrs))
СТАРЫЙ ОТВЕТ:
Похоже, что диктовка изречений была бы лучше.
import pandas
# INPUT
file_map = {
'file1.csv': {
'name': 'Cold',
'lines': '-',
'colors': 'b',
'marker': ''
},
# ...etc...
}
cases = []
for filename, attrs in file_map.iteritems():
case = pandas.read_csv(filename)
for attr, value in attrs.iteritems():
setattr(case, attr, value)
cases.append(case)
Вы также можете создать класс вложенных карт или экземпляры collections.namedtuple
, если хотите быть более строгими.
@hahnpv Да, вы можете, я понял благодаря ответу Адриана. Смотрите мою правку.
Для справки в будущем .assign (** attrs) создает столбцы в DataFrame, а не атрибуты. Старый ответ работал нормально.
Мне кажется, что ваш код достаточно хорош. Но если вы хотите избежать этих назначений внизу, попробуйте следующее:
import pandas
# INPUT
files = ['file1.csv','file2.csv','file3.csv','file4.csv', 'file5.csv']
names = ['Cold', 'Hot','Hotter','Hottest','Hottestest']
lines = ['-','-',':','-',':']
colors = ['b','r','r','y','y']
marker = ['','','','o','']
cases = [
pandas.read_csv(fname)
.assign(name=names[idx],
color=colors[idx],
marker=marker[idx],
lines=lines[idx])
for idx,case in enumerate(files)
]
Это близко к тому, на что я надеялся, что-то похожее на Matlab deal (): mathworks.com/company/newsletters/articles/…