Поэтапное объединение Python / Pandas 2 Series, содержащее множества в каждом элементе

python-3.x pandas set series set-union

466 просмотра

1 ответ

У меня есть 2 серии данных панд, которые, как я знаю, имеют одинаковую длину. Каждая серия содержит sets () в каждом элементе. Я хочу найти эффективный в вычислительном отношении способ получения поэлементного объединения этих двух серий. Я создал упрощенную версию кода с поддельной и короткой сериями, чтобы поиграть ниже. Эта реализация - ОЧЕНЬ неэффективный способ сделать это. Должен быть быстрый способ сделать это. Мои настоящие серии намного длиннее, и мне приходится делать эту операцию сотни тысяч раз.

import pandas as pd

set_series_1 = pd.Series([{1,2,3}, {'a','b'}, {2.3, 5.4}])
set_series_2 = pd.Series([{2,4,7}, {'a','f','g'}, {0.0, 15.6}])

n = set_series_1.shape[0]  
for i in range(0,n):
    set_series_1[i] = set_series_1[i].union(set_series_2[i])

print set_series_1        
>>> set_series_1
0          set([1, 2, 3, 4, 7])
1             set([a, b, g, f])
2    set([0.0, 2.3, 15.6, 5.4])
dtype: object

Я попытался объединить Series в кадр данных и использовать функцию apply, но я получаю сообщение об ошибке, в котором говорится, что наборы не поддерживаются в качестве элементов dataframe.

Автор: Jed Источник Размещён: 08.11.2019 10:55

Ответы (1)


1 плюс

Решение

pir4

Протестировав несколько вариантов, я наконец-то нашел хороший вариант ... pir4 ниже.


тестирование

def jed1(s1, s2):
    s = s1.copy()
    n = s1.shape[0]
    for i in range(n):
        s[i] = s2[i].union(s1[i])
    return s

def pir1(s1, s2):
    return pd.Series([item.union(s2[i]) for i, item in enumerate(s1.values)], s1.index)

def pir2(s1, s2):
    return pd.Series([item.union(s2[i]) for i, item in s1.iteritems()], s1.index)

def pir3(s1, s2):
    return s1.apply(list).add(s2.apply(list)).apply(set)

def pir4(s1, s2):
    return pd.Series([set.union(*z) for z in zip(s1, s2)])

введите описание изображения здесь

Автор: piRSquared Размещён: 20.08.2016 06:09
Вопросы из категории :
32x32