Есть ли более питонический способ распределения содержимого нескольких списков на поля в нескольких структурах? Пример ниже, используя 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]
1
hahnpv 13 Сен 2018 в 22:50

2 ответа

Лучший ответ

РЕДАКТИРОВАТЬ: Используя ответ Адриана, мы можем упростить это, используя 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, если хотите быть более строгими.

1
mVChr 13 Сен 2018 в 21:17

Ваш код кажется мне достаточно хорошим. Но если вы хотите избежать этих назначений внизу, попробуйте это:

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)
]
1
adrtam 13 Сен 2018 в 19:57