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?