Фрозенцет союз двух колонн - PullRequest
1 голос
/ 17 апреля 2019

У меня есть набор данных, содержащий две колонки с заморозками. Теперь я хотел бы объединить / принять объединение этих морозенцев. Я могу сделать это с помощью цикла for, однако мой набор данных содержит> 27 миллионов строк, поэтому я ищу способ избежать цикла for. У кого-нибудь есть мысли?

Данные

import pandas as pd
import numpy as np
d = {'ID1': [frozenset(['a', 'b']), frozenset(['a','c']), frozenset(['c','d'])],
    'ID2': [frozenset(['c', 'g']), frozenset(['i','f']), frozenset(['t','l'])]}
df = pd.DataFrame(data=d)

Код с для цикла

from functools import reduce
df['frozenset']=0
for i in range(len(df)):
    df['frozenset'].iloc[i] = reduce(frozenset.union, [df['ID1'][i],df['ID2'][i]])

Желаемый выход

    ID1      ID2     frozenset
0   (a, b)  (c, g)  (a, c, g, b)
1   (a, c)  (f, i)  (a, c, f, i)
2   (c, d)  (t, l)  (c, d, t, l)

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Не похоже, что вам нужно использовать functools.reduce здесь. Достаточно сделать прямой союз с каждой парой морозозонцев.

Если вы хотите максимально возможную скорость для такого рода операций, я рекомендую взглянуть на списки (см. Для циклов с пандами - Когда мне следует позаботиться? для исчерпывающего обсуждения).

df['union'] = [x | y for x, y in zip(df['ID1'], df['ID2'])]
df

      ID1     ID2         union
0  (a, b)  (c, g)  (c, a, b, g)
1  (c, a)  (f, i)  (c, a, i, f)
2  (c, d)  (l, t)  (c, l, d, t)

Если вы хотите обобщить это для нескольких столбцов, вы можете объединить их все, используя frozenset.union().

df['union2'] = [frozenset.union(*X) for X in df[['ID1', 'ID2']].values]
df

      ID1     ID2         union        union2
0  (a, b)  (c, g)  (c, a, b, g)  (c, a, b, g)
1  (c, a)  (f, i)  (c, a, i, f)  (c, a, i, f)
2  (c, d)  (l, t)  (c, l, d, t)  (c, l, d, t)
0 голосов
/ 17 апреля 2019

Вы можете попробовать:

import pandas as pd
import numpy as np

d = {'ID1': [frozenset(['a', 'b']), frozenset(['a','c']), frozenset(['c','d'])],
    'ID2': [frozenset(['c', 'g']), frozenset(['i','f']), frozenset(['t','l'])]}
df = pd.DataFrame(data=d)
from functools import reduce
df['frozenset']=0

add = []
for i in range(len(df)):
    df['frozenset'].iloc[i] = reduce(frozenset.union, [df['ID1'][i],df['ID2'][i]])
add.append(df)
print(add)
...