Для столбца DataFrame pandas преобразуйте список списков в список кортежей - PullRequest
0 голосов
/ 24 октября 2019

У меня есть следующие панды 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 ]

1 голос
/ 24 октября 2019

Код 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)]
1 голос
/ 24 октября 2019

Попробуйте это:

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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...