Python 使用DataFrame中其他两列的键和值创建字典列
我目前有一个Pandas数据框架,其中有两列,每列包含列表,另一列包含这两个列表元素的元组对。为了方便起见,玩具示例如下: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
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))