Pandy: przydzielanie wielu * nowych * kolumn jednocześnie

Mam DataFrame z kolumną zawierającą etykiety dla każdego wiersza (oprócz niektórych istotnych danych dla każdego wiersza). Mam słownik z kluczami równymi możliwym etykietom i wartościom równym 2 krotkom informacji związanych z tą etykietą. Chciałbym przypiąć dwie nowe kolumny do mojej ramki, po jednej dla każdej części 2-krotnej odpowiadającej etykiecie dla każdego rzędu.

Oto konfiguracja:

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)})

Mogę uzyskać to, czego chcę, uruchamiając:

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

Ale jak mogę to zrobić, jeśli nie chcę ręcznie wpisywać dwóch kolumn po lewej stronie przypisania? To znaczy. jak mogę utworzyć wiele nowych kolumn w locie. Na przykład, gdybym miał 10 kroteklabeldict zamiast 2-krotek byłby to prawdziwy ból, jak obecnie napisano. Oto kilka rzeczy, które nie działają:

# 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))

To działa, ale wygląda na hack:

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

Lepsze rozwiązania?

questionAnswers(3)

yourAnswerToTheQuestion