Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在包含列表的单元格上合并两个数据帧_Python_Pandas - Fatal编程技术网

Python 在包含列表的单元格上合并两个数据帧

Python 在包含列表的单元格上合并两个数据帧,python,pandas,Python,Pandas,我有两个数据帧,其中一个包含一列,列的单元格中有列表。以下是一个例子: DF 1 : | A B ---+---------------------------- 0 | 'A' ['A', 'B'] 1 | 'B' ['B', 'D'] 2 | 'C' ['D', 'E', 'F'] DF 2 : | C D ---+---------------------------- 0 | 'A' 'X' 1 | 'B' 'Y'

我有两个数据帧,其中一个包含一列,列的单元格中有列表。以下是一个例子:

DF 1 :
   | A      B
---+----------------------------
0  | 'A'    ['A', 'B']
1  | 'B'    ['B', 'D']
2  | 'C'    ['D', 'E', 'F']

DF 2 :
   | C      D
---+----------------------------
0  | 'A'    'X'
1  | 'B'    'Y'
2  | 'C'    'Z'
以下是设置数据帧的代码:

df1 = pd.DataFrame({'A': ["A", "B", "C"], "B": [["A", "B"], ["B", "D"], ["D", "E", "F"]]})
df2 = pd.DataFrame({'C': ["A", "B", "C"], "D": ["X", "Y", "Z"]})
我想使用DF1.B中的条件DF2.C在DF1和DF2之间进行内部联接,下面是我预期的结果:

DF1&DF2 :
   | A      B              C      D
---+--------------------------------------
0  | 'A'    ['A', 'B']     'A'    'X'
1  | 'A'    ['A', 'B']     'B'    'Y'
2  | 'B'    ['B', 'D']     'B'    'Y'
我阅读了解释如何使用concat实现连接的文章,但是我找不到如何使用成员资格测试作为连接条件

我错过什么了吗?你知道怎么做吗?

这首先是个问题,然后是合并问题


pd.concat[df1,df2],axis=1怎么样?@pygo我试过了,但结果不是我期望的。我不想对齐df1和df2。
df3=unnesting(df1,['B'])
df3.merge(df2,left_on='B',right_on='C',how='inner').drop('B',1).merge(df1)
Out[15]: 
   A  C  D       B
0  A  A  X  [A, B]
1  A  B  Y  [A, B]
2  B  B  Y  [B, D]
def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')