[英]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.