2016-11-01 77 views
1

我需要將字典映射到數據框中的列,但不知道如何在字典中的值位於列表中時執行此操作。理想情況下,我是pos [0]中值的新列,pos [1]中的值爲另一列。如何將包含列表值的字典映射到數據框?

dict = {'foo':['A','B'], 
     'bar':['C','D']} 

df = pd.DataFrame([[0,'foo'], 
        [1,'bar']], columns=['Col1','Col2']) 

下面是通常的方式,如果只有一個字典值,我會去做這個任務。

df['Col3'] = df.Col2.map(dict) 

回答

1

Series.map()也將接受功能,讓你可以通過在一個包裝查找詞典並抓取你想要的列表項的lambda函數中。

dict = {'foo':['A','B'], 
     'bar':['C','D']} 

df = pd.DataFrame([[0,'foo'], 
        [1,'bar']], columns=['Col1','Col2']) 

df['Col3'] = df.Col2.map(lambda x: dict[x][0]) 
df['Col4'] = df.Col2.map(lambda x: dict[x][1]) 
+1

完美。我認爲它可以用lambdas完成。很高興這很容易。 – WillacyMe

3

如果我正確理解你的問題,它可能是最簡單的,只是把字典轉爲一個數據幀,並使用pd.DataFrame.merge

In [40]: d = {'foo':['A','B'], 
    ...:  'bar':['C','D']} 

In [41]: df.merge(pd.DataFrame(d, index=["Col3", "Col4"]).T, 
        left_on='Col2', right_index=True) 
Out[41]: 
    Col1 Col2 Col3 Col4 
0  0 foo A B 
1  1 bar C D 
+0

謝謝。 .T做什麼?如果你不希望合併列表的所有值,你會怎麼做? – WillacyMe

+0

.T執行轉置,因爲默認情況下,'pd.DataFrame'將嘗試將字典鍵轉換爲列。 'merge'本質上就像一個SQL連接,因此Col2中不使用的字段將被忽略。 –