基于来自另一个数据框熊猫的匹配值的新列

Ava*_*jee 2 python merge dataframe pandas

如果我们有两个数据框,例如df1df2在下面的示例中;我们如何合并它们以生成df3

import pandas as pd
import numpy as np

data1 = [("a1",["A","B"]),("a2",["A","B","C"]),("a3",["B","C"])]
df1 = pd.DataFrame(data1,columns = ["column1","column2"])
print df1

data2 = [("A",["1","2"]),("B",["1","3","4"]),("C",["5"])]
df2 = pd.DataFrame(data2,columns=["column3","column4"])
print df2

data3 = [("a1",["A","B"],["1","2","3","4"]),("a2",["A","B","C"], 
["1","2","3","4","5"]),("a3",["B","C"],["1","3","4","5"])]
df3 = pd.DataFrame(data3,columns = ["column1","column2","column5"])
print df3
Run Code Online (Sandbox Code Playgroud)

我的目标是不使用循环,因为我正在处理大型数据集

WeN*_*Ben 7

stack重新创建后检查df1的列表列,DataFrame 然后map使用df2


另外,由于您要求不使用for循环,因此我正在使用sumsum对于这种情况,它比*for loop*或慢得多itertools


s=pd.DataFrame(df1.column2.tolist()).stack()
df1['New']=s.map(df2.set_index('column3').column4).sum(level=0).apply(set)
df1
Out[36]: 
  column1    column2              New
0      a1     [A, B]     {2, 4, 3, 1}
1      a2  [A, B, C]  {3, 5, 4, 2, 1}
2      a3     [B, C]     {4, 3, 1, 5}
Run Code Online (Sandbox Code Playgroud)

正如我提到的,并且我们大多数人都建议过,您也可以使用For循环检查熊猫-我什么时候应该关心?

import itertools
d=dict(zip(df2.column3,df2.column4))


l=[set(itertools.chain(*[d[y] for y in x ])) for x in df1.column2.tolist()]
df1['New']=l
Run Code Online (Sandbox Code Playgroud)