创建包含两个包含列表的 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 [] [] {}
我有一个如下所示的数据框:
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 [] [] {}