创建包含两个包含列表的 pandas df 列的字典的列

Create column containing the dict of two pandas df columns containing lists

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

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)

使用:

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      []               []                         {}

你可以试试 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      []               []                         {}