Преобразование списков кортежей из строк в фрейме данных pandas в один список кортежей

#python #pandas #list #tuples

#python #pandas #Список #кортежи

Вопрос:

У меня есть фрейм данных pandas, и я хочу объединить несколько списков кортежей в разных строках в один список кортежей. Набор данных содержит более 10 000 строк, и я хочу добавить весь список кортежей в один список кортежей.

 
InvoiceNo      Description    
534            [(AB, AC), (ACBO, PPK)]
415            [(AD, AT), (CBO, PKD), (CBO, PKA)]
315            [(FDC, ATO), (VBO, IKD), (CVB, PKD)]

Desired output:

Edges =  [(AB, AC), (ACBO, PPK), (AD, AT), (CBO, PKD), (CBO, PKA), (FDC, ATO), (VBO, IKD), (CVB, PKD)]



  

Ответ №1:

Используйте понимание списка для сглаживания вложенных списков кортежей:

 Edges = [y for x in df.Description for y in x]
print (Edges)
[('AB', 'AC'), ('ACBO', 'PPK'), ('AD', 'AT'), ('CBO', 'PKD'), 
 ('CBO', 'PKA'), ('FDC', 'ATO'), ('VBO', 'IKD'), ('CVB', 'PKD')]
  

Или chain.from_iterable для повышения производительности:

 from  itertools import chain

Edges = list(chain.from_iterable(df.Description))
print (Edges)
[('AB', 'AC'), ('ACBO', 'PPK'), ('AD', 'AT'), ('CBO', 'PKD'), 
 ('CBO', 'PKA'), ('FDC', 'ATO'), ('VBO', 'IKD'), ('CVB', 'PKD')]
  

Комментарии:

1. Когда я использовал ‘y’, я получил сообщение об ошибке, в котором говорится, что ‘y’ не определен. Однако я заменил ‘y’ на ‘x’, и, похоже, это работает. out = [z для x в df.Описание для z в x]

Ответ №2:

для pandas версии 1 вы также можете использовать метод explode:

 df['Description'].explode().tolist()
  

вывод:

 [('AB', 'AC'), ('ACBO', 'PPK'), ('AD', 'AT'), ('CBO', 'PKD'), ('FDC', 'ATO'), ('VBO', 'IKD'), ('CVB', 'PKD')]
  

Ответ №3:

Из-за количества строк дублирующиеся ребра создают проблемы для вашего приложения?

Если это произойдет, рассмотрите тип sets вместо списка. Затем вы можете использовать прекрасное понимание Израэля в одной строке с {}:

 Edges = {y for x in df.Description for y in x}