【问题标题】:Create column containing the dict of two pandas df columns containing lists创建包含两个包含列表的熊猫 df 列的字典的列
【发布时间】:2021-12-17 04:29:45
【问题描述】:

我有一个如下所示的数据框:

df
        a                      b
0   [1, 2]    ['first', 'second']
1       []                     []
2      [5]                    [1]
3       []                     []
4    ['a']                  ['b']
5       []                     []

我想创建一个列 (c),它应该有一个字典,其中包含列 (a) 和 (b) 上的值的 zip。

如果 (a) 和 (b) 列的值不是列表,我可以使用 df.c = dict(zip(df.a, df.b))。但是,因为它们是列表,所以它给了我一个错误。我可以通过list(zip(df.a, df.b)) 将它们转换为元组,但遗憾的是需要字典。

最终,我正在寻找的输出如下:

df
        a                      b                           c
0   [1, 2]    ['first', 'second']    {1: 'first', 2:'second'}
1       []                     []                          {}
2      [5]                    [1]                       {5:1}
3       []                     []                          {}
4    ['a']                  ['b']                   {'a':'b'}
5       []                     []                          {}

有没有循环遍历数据框 1by1 行的任何想法?

两个答案都给出相同的输出。谢谢你的回答。但是在基准测试之后,我接受了最快的。

%timeit [dict(zip(ai, bi)) for ai, bi in zip(df['parameter_ids'], df['parameter_values'])]
7.76 ms ± 77 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df[['parameter_ids', 'parameter_values']].apply(lambda row: dict(zip(*row)), axis=1)
140 ms ± 2.81 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

【问题讨论】:

    标签: python pandas dataframe dictionary series


    【解决方案1】:

    你可以试试df.apply:

    >>> df['c'] = df.apply(lambda row: dict(zip(*row)), axis=1)
    >>> df
    
            a                b                          c
    0  [1, 2]  [first, second]  {1: 'first', 2: 'second'}
    1      []               []                         {}
    2     [5]              [1]                     {5: 1}
    3      []               []                         {}
    4     [a]              [b]                 {'a': 'b'}
    5      []               []                         {}
    

    【讨论】:

    • 如果我在 df 中有其他列,我认为这不会起作用?
    • @oakca df['c'] = df[['a','b']].apply(...
    • @QuangHoang 你是对的。抱歉,一开始没想到。但是 .apply 的性能很差
    • .apply 与接受的答案中的列表理解基本相同,可能稍慢,但具有代码可读性的优势。
    • @QuangHoang 我不会稍微慢一点。
    【解决方案2】:

    用途:

    import pandas as pd
    
    # setup
    data = [[[1, 2], ['first', 'second']],
            [[], []],
            [[5], [1]],
            [[], []],
            [['a'], ['b']],
            [[], []]]
    df = pd.DataFrame(data=data, columns=["a", "b"])
    
    df["c"] = [dict(zip(ai, bi)) for ai, bi in zip(df.a, df.b)]
    print(df)
    

    输出

            a                b                          c
    0  [1, 2]  [first, second]  {1: 'first', 2: 'second'}
    1      []               []                         {}
    2     [5]              [1]                     {5: 1}
    3      []               []                         {}
    4     [a]              [b]                 {'a': 'b'}
    5      []               []                         {}
    

    【讨论】:

    • 无论我是否有其他包含其他内容的列,这都有效。谢谢! (我会在 6 分钟内接受)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    相关资源
    最近更新 更多