Python 基于来自另一个数据帧的匹配值的新列

Python 基于来自另一个数据帧的匹配值的新列,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,如果在下面的示例中有两个数据帧,例如df1和df2;我们如何合并它们以生成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",

如果在下面的示例中有两个数据帧,例如
df1
df2
;我们如何合并它们以生成
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

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

在使用
DataFrame重新创建后检查
df1的列表列
然后映射
df2


另外,由于您要求不使用for循环,我使用的是
sum
,而这种情况下
sum
*for循环*
itertools



正如我提到的和我们大多数人建议的,你也可以向


您可以按以下方式进行操作:

df2_dict = {i:j for i,j in zip(df2['column3'].values, df2['column4'].values)}
# print(df2_dict)

def func(val):
    return sorted(list(set(np.concatenate([df2_dict.get(i) for i in val]))))

df1['column5'] = df1['column2'].apply(func)
print(df1)
输出:

  column1    column2          column5
0      a1     [A, B]     [1, 2, 3, 4]
1      a2  [A, B, C]  [1, 2, 3, 4, 5]
2      a3     [B, C]     [1, 3, 4, 5]
这项工作:


df1['column2'].apply(lambda x:list(set((np.concatenate([df2.set_index('column3')['column4'][i]表示列表中的i(x)]))))

你必须删除重复项,不是吗?@Wen Ben
。apply(set)
而不是
。apply(tuple)
?@jezrael是的,我认为for-loop非常适合这种类型的应用question@coldspeed很高兴我能帮忙:-)
df2_dict = {i:j for i,j in zip(df2['column3'].values, df2['column4'].values)}
# print(df2_dict)

def func(val):
    return sorted(list(set(np.concatenate([df2_dict.get(i) for i in val]))))

df1['column5'] = df1['column2'].apply(func)
print(df1)
  column1    column2          column5
0      a1     [A, B]     [1, 2, 3, 4]
1      a2  [A, B, C]  [1, 2, 3, 4, 5]
2      a3     [B, C]     [1, 3, 4, 5]