【问题标题】:Intersection of sets as columns in pandas集合的交集作为熊猫中的列
【发布时间】:2017-07-21 13:54:16
【问题描述】:

我有一个 df,例如:

df=pd.DataFrame.from_items([('i', [set([1,2,3,4]), set([1,2,3,4]), set([1,2,3,4]),set([1,2,3,4])]), ('j', [set([2,3]), set([1]), set([4]),set([3,4])])])

看起来像

>>> df
              i       j
0  {1, 2, 3, 4}  {2, 3}
1  {1, 2, 3, 4}     {1}
2  {1, 2, 3, 4}     {4}
3  {1, 2, 3, 4}  {3, 4}

我想计算 df.i.intersection(df.j) 并将其指定为 k 列。也就是说,我想要这个:

df['k']=[df.i.iloc[t].intersection(df.j.iloc[t]) for t in range(4)]

>>> df.k
0    {2, 3}
1       {1}
2       {4}
3    {3, 4}
Name: k, dtype: object

这个有 df.apply() 吗?实际的 df 是数百万行。

【问题讨论】:

    标签: python pandas set intersection


    【解决方案1】:

    pandas 中使用sets、lists 和dicts 有点问题,因为最好使用标量:

    df['k'] = [x[0] & x[1] for x in zip(df['i'], df['j'])]
    print (df)
                  i       j       k
    0  {1, 2, 3, 4}  {2, 3}  {2, 3}
    1  {1, 2, 3, 4}     {1}     {1}
    2  {1, 2, 3, 4}     {4}     {4}
    3  {1, 2, 3, 4}  {3, 4}  {3, 4}
    

    df['k'] = [x[0].intersection(x[1]) for x in zip(df['i'], df['j'])]
    print (df)
                  i       j       k
    0  {1, 2, 3, 4}  {2, 3}  {2, 3}
    1  {1, 2, 3, 4}     {1}     {1}
    2  {1, 2, 3, 4}     {4}     {4}
    3  {1, 2, 3, 4}  {3, 4}  {3, 4}
    

    apply 的解决方案:

    df['k'] = df.apply(lambda x: x['i'].intersection(x['j']), axis=1)
    print (df)
                  i       j       k
    0  {1, 2, 3, 4}  {2, 3}  {2, 3}
    1  {1, 2, 3, 4}     {1}     {1}
    2  {1, 2, 3, 4}     {4}     {4}
    3  {1, 2, 3, 4}  {3, 4}  {3, 4}
    

    【讨论】:

      【解决方案2】:

      您可以使用集合差异重现集合交集。 A 和 B 的交集等于 A 减去 A 中不在 B 中的元素。(您可以使用 B 进行对称)。

      所以,你可以使用dataframesub方法来操作集合差异:

      df['k'] = df['i'].sub(df['i'].sub(df['j']))
      # df['k'] = df['j'].sub(df['j'].sub(df['i'])) # equivalent
      

      这给出了预期的输出:

      df
      Out[11]: 
                    i       j       k
      0  {1, 2, 3, 4}  {2, 3}  {2, 3}
      1  {1, 2, 3, 4}     {1}     {1}
      2  {1, 2, 3, 4}     {4}     {4}
      3  {1, 2, 3, 4}  {3, 4}  {3, 4}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 2017-03-24
        • 2017-01-25
        相关资源
        最近更新 更多