【问题标题】:How do I map a dictionary with list values to a dataframe?如何将具有列表值的字典映射到数据框?
【发布时间】:2016-11-01 20:39:40
【问题描述】:

我需要将 dict 映射到数据框中的列,但是当 dict 中的值在列表中时,我不知道该怎么做。理想情况下,我是 pos [0] 中的值的新列,而 pos [1] 中的值的另一列。

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

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

如果只有一个 dict 值,以下是我执行此任务的常用方法。

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

【问题讨论】:

    标签: python list pandas dictionary dataframe


    【解决方案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])
    

    【讨论】:

    • 完美。我认为它可以用 lambdas 完成。很高兴就这么简单。
    【解决方案2】:

    如果我正确理解您的问题,将字典转换为数据框并使用 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
    

    【讨论】:

    • 谢谢。 .T 有什么作用?另外,如果您不想合并列表的所有值,您会怎么做?
    • .T 会进行转置,因为默认情况下,pd.DataFrame 会尝试将字典键放入列中。 merge 本质上类似于 SQL 连接,因此 Col2 中未使用的字段将被忽略。
    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 2021-07-14
    • 2021-10-26
    • 2018-05-03
    • 2015-07-24
    • 2018-09-21
    • 2018-08-13
    相关资源
    最近更新 更多