Примените функцию попарно на ряды панды

У меня есть серия панд, элементы которой составляют фризонсет:

data = {0: frozenset({'apple', 'banana'}), 1: frozenset({'apple', 'orange'}), 2: frozenset({'banana'}), 3: frozenset({'kumquat', 'orange'}), 4: frozenset({'orange'}), 5: frozenset({'orange', 'pear'}), 6: frozenset({'orange', 'pear'}), 7: frozenset({'apple', 'banana', 'pear'}), 8: frozenset({'banana', 'persimmon'}), 9: frozenset({'apple'}), 10: frozenset({'banana'}), 11: frozenset({'apple'})} tokens = pd.Series(data); tokens 0 (apple, banana) 1 (orange, apple) 2 (banana) 3 (orange, kumquat) 4 (orange) 5 (orange, pear) 6 (orange, pear) 7 (apple, banana, pear) 8 (persimmon, banana) 9 (apple) 10 (banana) 11 (apple) Name: Tokens, dtype: object 

Я хочу применить функцию попарно. Например, tokens.diff дает мне заданную разницу между последовательными строками:

 0 NaN 1 (orange) 2 (banana) 3 (orange, kumquat) 4 () 5 (pear) 6 () 7 (apple, banana) 8 (persimmon) 9 (apple) 10 (banana) 11 (apple) Name: Tokens, dtype: object 

Я хотел бы то же самое, но вместо того, чтобы устанавливать разницу, я хочу, чтобы объединение объединения последовательных строк. Поэтому мне бы хотелось:

 0 NaN 1 (orange, apple, banana) 2 (banana, orange, apply) 3 (orange, kumquat, banana) 4 (orange, kumquat) ... 

Как я могу добиться этого с помощью Панд? Я знаю, что могу сделать это с помощью zip и списка comp, но надеюсь, что есть лучший способ.

One Solution collect form web for “Примените функцию попарно на ряды панды”

Пара способов

Вариант 1] понимание списка

 In [3631]: pd.Series([x[0].union(x[1]) for x in zip(tokens, tokens.shift(-1).fillna(''))], index=tokens.index) Out[3631]: 0 (orange, banana, apple) 1 (orange, apple, banana) 2 (orange, kumquat, banana) 3 (orange, kumquat) 4 (orange, pear) 5 (orange, pear) 6 (orange, pear, banana, apple) 7 (persimmon, pear, banana, apple) 8 (apple, persimmon, banana) 9 (apple, banana) 10 (banana, apple) 11 (apple) dtype: object 

Вариант 2] map

 In [3632]: pd.Series(map(lambda x: x[0].union(x[1]), zip(tokens, tokens.shift(-1).fillna(''))), index=tokens.index) Out[3632]: 0 (orange, banana, apple) 1 (orange, apple, banana) 2 (orange, kumquat, banana) 3 (orange, kumquat) 4 (orange, pear) 5 (orange, pear) 6 (orange, pear, banana, apple) 7 (persimmon, pear, banana, apple) 8 (apple, persimmon, banana) 9 (apple, banana) 10 (banana, apple) 11 (apple) dtype: object 

Вариант 3] Использование concat и apply

 In [3633]: pd.concat([tokens, tokens.shift(-1).fillna('')], axis=1).apply(lambda x: x[0].union(x[1]), axis=1) Out[3633]: 0 (orange, banana, apple) 1 (orange, apple, banana) 2 (orange, kumquat, banana) 3 (orange, kumquat) 4 (orange, pear) 5 (orange, pear) 6 (orange, pear, banana, apple) 7 (persimmon, pear, banana, apple) 8 (apple, persimmon, banana) 9 (apple, banana) 10 (banana, apple) 11 (apple) dtype: object 

Задержки

 In [3647]: tokens.shape Out[3647]: (60000L,) In [3648]: %timeit pd.Series([x[0].union(x[1]) for x in zip(tokens, tokens.shift(-1).fillna(''))], index=tokens.index) 10 loops, best of 3: 35 ms per loop In [3649]: %timeit pd.Series(map(lambda x: x[0].union(x[1]), zip(tokens, tokens.shift(-1).fillna(''))), index=tokens.index) 10 loops, best of 3: 40.9 ms per loop In [3650]: %timeit pd.concat([tokens, tokens.shift(-1).fillna('')], axis=1).apply(lambda x: x[0].union(x[1]), axis=1) 1 loop, best of 3: 2.2 s per loop 

Несвязанный и ради числа на diff

 In [3653]: %timeit tokens.diff() 10 loops, best of 3: 10.8 ms per loop 
  • Набор литералов дает отличный результат при вызове функции set
  • Можно ли создать Python для генерации трассировки, аналогичной набору bash -x?
  • Как клонировать или копировать набор в Python?
  • Лучший способ найти пересечение нескольких множеств?
  • Практическое использование операторов реверсивного набора в Python
  • Есть ли эквивалент Python для C ++ «multiset <int>»?
  •  
    Interesting Posts for Van-Lav

    Объединить последовательные строки с одинаковыми значениями столбцов

    Python Pandas, используя предыдущее значение в Dataframe

    Python: длина самого длинного подсети?

    numpy loadtxt single line / row as list

    python: Как определить, когда мой поток становится сиротой?

    Каков наилучший способ запуска нескольких подпроцессов через fork ()?

    Как уменьшить размер узких мест промежуточного слоя VGG16?

    Python – получить имена процессов, процессор, использование Mem и использование пикового ввода в окнах

    Как воспроизводить данные WAV прямо из памяти?

    Python, Pandas: возвращает только те строки, у которых отсутствуют значения

    Неправильная дата, связанная с ранним утром, соскоблила с веб-сайта погоды (Python) + только данные за январь?

    Как получить идентификатор канала из имени канала или URL-адреса

    Ошибка аргумента при установке virtualenvwrapper-powershell

    Как сохранить импорт в Django?

    Чтение / запись сетевого объекта GraphX

    Python - лучший язык программирования в мире.