Панды: назначение нескольких * новых * столбцов одновременно

У меня есть DataFrame со столбцом, содержащим метки для каждой строки (в дополнение к некоторым соответствующим данным для каждой строки). У меня есть словарь с ключами, равными возможным меткам, и значениями, равными 2 кортежам информации, связанной с этой меткой. Я хотел бы прикрепить два новых столбца к моему фрейму, по одному для каждой части 2-кортежа, соответствующего метке для каждой строки.

Вот установка:

import pandas as pd
import numpy as np

np.random.seed(1)
n = 10

labels = list('abcdef')
colors = ['red', 'green', 'blue']
sizes = ['small', 'medium', 'large']

labeldict = {c: (np.random.choice(colors), np.random.choice(sizes)) for c in labels}

df = pd.DataFrame({'label': np.random.choice(labels, n), 
                   'somedata': np.random.randn(n)})

Я могу получить то, что хочу, запустив:

df['color'], df['size'] = zip(*df['label'].map(labeldict))
print df

  label  somedata  color    size
0     b  0.196643    red  medium
1     c -1.545214  green   small
2     a -0.088104  green   small
3     c  0.852239  green   small
4     b  0.677234    red  medium
5     c -0.106878  green   small
6     a  0.725274  green   small
7     d  0.934889    red  medium
8     a  1.118297  green   small
9     c  0.055613  green   small

Но как я могу это сделать, если я не хочу вручную печатать два столбца в левой части задания? То есть Как я могу создать несколько новых столбцов на лету. Например, если бы у меня было 10 кортежей вlabeldict вместо 2-х кортежей это будет настоящей болью, как написано в настоящее время. Вот пара вещей, которые не работают:

# set up attrlist for later use
attrlist = ['color', 'size']

# non-working idea 1)
df[attrlist] = zip(*df['label'].map(labeldict))

# non-working idea 2)
df.loc[:, attrlist] = zip(*df['label'].map(labeldict))

Это работает, но похоже на взлом:

for a in attrlist:
    df[a] = 0
df[attrlist] = zip(*df['label'].map(labeldict))

Лучшие решения?

Ответы на вопрос(3)

Ваш ответ на вопрос