2016-11-01 36 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中不使用的字段将被忽略。 –