#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}