【问题标题】:Frozenset union of two columns两列的冻结集并集
【发布时间】:2019-04-17 09:27:08
【问题描述】:

我有一个包含两列的数据集,其中包含冻结集。现在我想合并/合并这些frozensets。我可以使用 for 循环来做到这一点,但是我的数据集包含超过 2700 万行,所以我正在寻找一种避免 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)

带有 for 循环的代码

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 列执行此操作,还是应该通用解决方案?

标签: python pandas union frozenset


【解决方案1】:

您似乎不需要在这里使用functools.reduce。与每对frozensets 直接联合就足够了。

如果您希望以最快的速度执行此类操作,我建议您查看列表推导(请参阅For loops with pandas - When should I care? 了解详尽的讨论)。

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)

【讨论】:

  • 谢谢,这个链接对我帮助很大,这是我经常遇到的问题!非常感谢!
【解决方案2】:

你可以试试:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多