【问题标题】:For a pandas DataFrame column, convert a list of lists into a list of tuples对于 pandas DataFrame 列,将列表列表转换为元组列表
【发布时间】:2023-04-03 01:40:01
【问题描述】:

我有以下熊猫数据框:

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

但是,我不知道如何在 pandas 中有效地逐行执行此操作。我的第一个想法是创建一个新列,如下所示:

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

如果这很明显,我很抱歉——我的熊猫生锈了。

【问题讨论】:

  • 发布了我的答案,但只是好奇 - 使用元组列表而不是列表列表有什么区别?

标签: python pandas numpy dataframe tuples


【解决方案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)]

【讨论】:

  • 这与嵌套列表理解或嵌套映射有何不同?为什么要混合两种方法来做本质上相同的事情?
  • 似乎你可以使用所有 3 个组合来做到这一点——这是我首先想到的,对我来说它似乎比 list(map(lambda x: list(map(tuple, x)), df1.F)) 更具可读性。可能与@brunoto 的答案一样可读
【解决方案2】:

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

【讨论】:

  • “这意味着您在行上使用元组,而不是像您所希望的那样使用内部列表。”啊,好的——我现在明白了!谢谢
猜你喜欢
  • 2021-03-01
  • 2013-11-04
  • 2013-02-13
  • 2017-08-15
  • 2019-04-21
  • 2019-02-15
  • 2018-05-29
  • 2018-12-19
  • 2022-09-27
相关资源
最近更新 更多