对于pandas DataFrame列,将列表列表转换为元组列表

时间:2019-10-24 02:45:33

标签: python pandas numpy dataframe tuples

我有以下熊猫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],)

很抱歉,这很明显-我的大熊猫生锈了。

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)]