【问题标题】:Python/Pandas element wise union of 2 Series containing sets in each element2 系列的 Python/Pandas 元素明智联合,每个元素中包含集合
【发布时间】:2016-12-27 07:20:38
【问题描述】:

我有 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 函数,但我收到一条错误消息,指出不支持将集合作为数据框元素。

【问题讨论】:

    标签: python-3.x pandas set series set-union


    【解决方案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)])
    

    【讨论】:

    • 看起来 pir4 中有一个小错字。函数定义。内部 zip 应该是 (s1, s2) 正确吗?
    • @Jed 是的!正确
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多