熊猫多列交叉

时间:2017-09-26 13:13:24

标签: python pandas

我的数据框如下:

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]  []

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

选项1:

交集语法;WITH T AS( Select * FROM TestingTool_WeeklyReports T1 INNER JOIN TestDS_DSReleaseNotes T2 ON T1.Datasourcename = t2.functionname) Update T SET InReleasenotes = 'YES' ..是正确的,但您需要稍微调整一下以适用于数据帧,如下所示:

set(A)&set(B)

您可以按以下步骤操作:

选项2:

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

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

选项3:

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

这是做什么的:

  • 每行使用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))..