【问题标题】:Pandas multiple column intersectionPandas 多列交叉
【发布时间】:2017-09-26 13:13:24
【问题描述】:

我有一个数据框如下:

data={'NAME':['JOHN','MARY','CHARLIE'],
  'A':[[1,2,3],[2,3,4],[3,4,5]],
  'B':[[2,3,4],[3,4,5],[4,5,6]],
    'C':[[2,4],[3,4],[6,7]]  }
df=pd.DataFrame(data)
df=df[['NAME','A','B','C']]
NAME          A          B            C
0   JOHN    [1, 2, 3]   [2, 3, 4]   [2, 4]
1   MARY    [2, 3, 4]   [3, 4, 5]   [3, 4]
2   CHARLIE [3, 4, 5]   [4, 5, 6]   [6, 7]

我需要所有列 A、B、C 的交集。

我尝试了以下代码,但没有成功:

df['D']=list(set(df['A'])&set(df['B'])&set(df['C']))

需要的输出如下:

    NAME            A         B         C       D
0   JOHN    [1, 2, 3]   [2, 3, 4]   [2, 4]  [2]
1   MARY    [2, 3, 4]   [3, 4, 5]   [3, 4]  [3, 4]
2   CHARLIE [3, 4, 5]   [4, 5, 6]   [6, 7]  []

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用答案here,将其逐行应用于数据框:

    df[['A', 'B', 'C']].apply(
        lambda row: list(set.intersection(*[set(row[col]) for col in row.index])), 
        axis=1
    )
    

    请注意,按行应用函数时,行的索引值是原始数据框的列。

    【讨论】:

      【解决方案2】:

      选项1:

      交集语法set(A)&set(B).. 是正确的,但您需要对其稍作调整以适用于数据帧,如下所示:

      df.assign(D=df.transform(
           lambda x: list(set(x.A)&set(x.B)&set(x.C)),
           axis=1))
      

      您可以按照以下方式进行:

      选项2:

      df.assign(D=df.transform(
          lambda x: list(set(x.A).intersection(set(x.B)).intersection(set(x.C))),
          axis=1))
      

      df.assign(D=df.apply(
          lambda x: list(set(x.A).intersection(set(x.B)).intersection(set(x.C))),
          axis=1))
      

      选项 3:

      df.assign(D=df.transform(
          lambda x: list(reduce(set.intersection, map(set,x.tolist()[1:]))),
          axis=1))
      

      这是做什么的:

      • 使用set(x.A).intersection(set(x.B)).. 逐行获取交集
      • 将结果转换为列表
      • 对数据框中的每一行都这样做

      执行细节:

      In [76]: df.assign(D=df.transform(
          ...:     lambda x: list(set(x.A).intersection(set(x.B)).intersection(set(x.C))),
          ...:     axis=1))
      Out[76]: 
            NAME          A          B       C       D
      0     JOHN  [1, 2, 3]  [2, 3, 4]  [2, 4]     [2]
      1     MARY  [2, 3, 4]  [3, 4, 5]  [3, 4]  [3, 4]
      2  CHARLIE  [3, 4, 5]  [4, 5, 6]  [6, 7]      []
      

      【讨论】:

        【解决方案3】:
        df[['A','B','C']].apply(lambda x : list(set.intersection(*map(set,list(x)))),axis=1 )
        
        Out[1192]: 
        0       [2]
        1    [3, 4]
        2        []
        dtype: object
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-05
          • 2021-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多