Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用DataFrame中其他两列的键和值创建字典列_Python_Pandas - Fatal编程技术网

Python 使用DataFrame中其他两列的键和值创建字典列

Python 使用DataFrame中其他两列的键和值创建字典列,python,pandas,Python,Pandas,我目前有一个Pandas数据框架,其中有两列,每列包含列表,另一列包含这两个列表元素的元组对。为了方便起见,玩具示例如下: col1 col2 col3 col4 0 'a' [0, 1] [8, 9] [(0, 8), (1, 9)] 1 'b' [2, 3] [10, 11] [(2, 10), (3, 11)] 2 'c' [4, 5

我目前有一个Pandas数据框架,其中有两列,每列包含列表,另一列包含这两个列表元素的元组对。为了方便起见,玩具示例如下:

        col1       col2       col3       col4
0        'a'       [0, 1]     [8, 9]     [(0, 8), (1, 9)]
1        'b'       [2, 3]     [10, 11]   [(2, 10), (3, 11)]
2        'c'       [4, 5]     [12, 13]   [(4, 12), (5, 13)]
3        'd'       [6, 7]     [14, 15]   [(6, 14), (7, 15)]
我想做的是创建一个第5列col5,其中包含字典,其中col3中的值作为键,col2中的值作为值。例如:

        col1       col2       col3       col4                 col5
0        'a'       [0, 1]     [8, 9]     [(0, 8), (1, 9)]     {'8': 0, '9': 1}
1        'b'       [2, 3]     [10, 11]   [(2, 10), (3, 11)]   {'10': 2, '11': 3}
2        'c'       [4, 5]     [12, 13]   [(4, 12), (5, 13)]   {'12': 4, '13': 5}
3        'd'       [6, 7]     [14, 15]   [(6, 14), (7, 15)]   {'14': 6, '15': 7}
我尝试过一些方法,比如

df['col5'] = dict(zip(df['col4'].apply(ast.literal_eval), df['col3'].apply(ast.literal_eval)))
但是我收到一个错误。我最合适的方式是什么?提前感谢。

如果laready创建的col4可以与map循环:

或者,如果输入为col3和col2,则使用zip和列表理解:

或采用以下方法的解决方案:


你好谢谢你的回复。当列表中的某些元素为nan时,我该怎么办?每当我尝试执行这些操作时,都会抛出一个格式错误的节点或字符串错误。它们在col2中。@Seankala-那么输出应该是空的dtct,就像col5中的{}或NaN一样?这也是我所期望的,但出于某种原因它会抛出一个错误。。。也许这是因为我在创建原始数据帧时犯了一个错误而出现的问题。我会从头开始再试一次。是的,很好用。我认为数据帧本身有问题。您的解决方案与我创建的其他玩具数据帧配合良好。
df['col5'] = df['col4'].map(lambda x: [{b:a} for a, b in ast.literal_eval(x)])
print (df)
  col1    col2      col3                col4                col5
0  'a'  [0, 1]    [8, 9]    [(0, 8), (1, 9)]    [{8: 0}, {9: 1}]
1  'b'  [2, 3]  [10, 11]  [(2, 10), (3, 11)]  [{10: 2}, {11: 3}]
2  'c'  [4, 5]  [12, 13]  [(4, 12), (5, 13)]  [{12: 4}, {13: 5}]
3  'd'  [6, 7]  [14, 15]  [(6, 14), (7, 15)]  [{14: 6}, {15: 7}]
df['col5'] = [dict(zip(ast.literal_eval(a), ast.literal_eval(b))) 
              for a, b in zip(df['col3'], df['col2'])]

print (df)
  col1    col2      col3                col4            col5
0  'a'  [0, 1]    [8, 9]    [(0, 8), (1, 9)]    {8: 0, 9: 1}
1  'b'  [2, 3]  [10, 11]  [(2, 10), (3, 11)]  {10: 2, 11: 3}
2  'c'  [4, 5]  [12, 13]  [(4, 12), (5, 13)]  {12: 4, 13: 5}
3  'd'  [6, 7]  [14, 15]  [(6, 14), (7, 15)]  {14: 6, 15: 7}
df['col5'] = (df.apply(lambda x:  dict(zip(ast.literal_eval(x['col3']), 
                                           ast.literal_eval(x['col2']))), axis=1))