我有以下熊猫DataFrame:
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2, 3, 4, 47, 27], 'B': [5, 6, 7, 8, 21, 40],
'C': [9, 10, 11, 12, 45, 33], 'D': [3, 4, 1, 2, 27, 47], 'E': [7, 8, 5, 6, 40, 21],
'F': [[[11, 35], [36, 37]], [[12, 42], [14, 11]], [[9, 37], [10, 43], [12, 28]], [[105, 27]], [], [[45, 2]]]})
print(df1)
## A B C D E F
## 0 1 5 9 3 7 [[11, 35], [36, 37]]
## 1 2 6 10 4 8 [[12, 42], [14, 11]]
## 2 3 7 11 1 5 [[9, 37], [10, 43], [12, 28]]
## 3 4 8 12 2 6 [[105, 27]]
## 4 47 21 45 27 40 []
## 5 27 40 33 47 21 [[45, 2]]
##
列F是列表的列表。我想将其转换为元组列表。
通常,将列表列表转换为元组列表的方法是通过简单的列表理解,例如
foo = [[9, 37], [10, 43], [12, 28]]
foo = [tuple(lst) for lst in foo]
print(foo)
## [(9, 37), (10, 43), (12, 28)]
但是,我不知道如何有效地在熊猫中逐行执行此操作。我的第一个想法是创建一个新列,如下所示:
df1['new_col'] = [tuple(lst) for lst in df1.F]
但是,这显然给出了错误的结果--- F现在是列表的元组,而不是元组列表:
df1
A B C D E F new_col
0 1 5 9 3 7 [[11, 35], [36, 37]] ([11, 35], [36, 37])
1 2 6 10 4 8 [[12, 42], [14, 11]] ([12, 42], [14, 11])
2 3 7 11 1 5 [[9, 37], [10, 43], [12, 28]] ([9, 37], [10, 43], [12, 28])
3 4 8 12 2 6 [[105, 27]] ([105, 27],)
4 47 21 45 27 40 [] ()
5 27 40 33 47 21 [[45, 2]] ([45, 2],)
很抱歉,这很明显-我的大熊猫生锈了。
答案 0 :(得分:1)
尝试一下:
In [8]: df1['new_col'] = [list(map(tuple, lst)) for lst in df1.F]
In [9]: print(df1)
A B C D E F new_col
0 1 5 9 3 7 [[11, 35], [36, 37]] [(11, 35), (36, 37)]
1 2 6 10 4 8 [[12, 42], [14, 11]] [(12, 42), (14, 11)]
2 3 7 11 1 5 [[9, 37], [10, 43], [12, 28]] [(9, 37), (10, 43), (12, 28)]
3 4 8 12 2 6 [[105, 27]] [(105, 27)]
4 47 21 45 27 40 [] []
5 27 40 33 47 21 [[45, 2]] [(45, 2)]
答案 1 :(得分:1)
代码for lst in df.F
遍历每一行,这意味着您在该行上使用元组,而不是像您讨厌的内部列表。
花一秒钟遍历每行的内部列表将完成此工作。试试这个:
df1['new_col'] = [[tuple(lst_in) for lst_in in lst] for lst in df1.F]
输出:
A B C D E F new_col
0 1 5 9 3 7 [[11, 35], [36, 37]] [(11, 35), (36, 37)]
1 2 6 10 4 8 [[12, 42], [14, 11]] [(12, 42), (14, 11)]
2 3 7 11 1 5 [[9, 37], [10, 43], [12, 28]] [(9, 37), (10, 43), (12, 28)]
3 4 8 12 2 6 [[105, 27]] [(105, 27)]
4 47 21 45 27 40 [] []
5 27 40 33 47 21 [[45, 2]] [(45, 2)]