簡體   English   中英

對於 pandas DataFrame 列,將列表列表轉換為元組列表

[英]For a pandas DataFrame column, convert a list of lists into a list of tuples

我有以下 pandas 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)]

但是,我不知道如何在 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],)

如果這很明顯,我很抱歉——我的 pandas 生銹了。

嘗試這個:

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

for lst in df.F的代碼遍歷每一行,這意味着您在行上使用元組,而不是像您所希望的那樣使用內部列表。

對每一行的內部列表進行第二次迭代就可以完成這項工作。 嘗試這個:

df1['new_col'] = [[tuple(lst_in) for lst_in in lst] for lst in df1.F]

Output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM