将两个 pandas DataFrame 合并到包含列表的单元格上

2024-03-15

我有两个 DataFrame,其中一个包含一列,其单元格内包含列表。这是一个例子:

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'

这是设置 DataFrame 的代码:

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 和 DF2 之间进行内部联接,条件如下DF2.C in DF1.B,这是我期望的结果:

DF1&DF2 :
   | A      B              C      D
---+--------------------------------------
0  | 'A'    ['A', 'B']     'A'    'X'
1  | 'A'    ['A', 'B']     'B'    'Y'
2  | 'B'    ['B', 'D']     'B'    'Y'

我读了文档 https://pandas.pydata.org/pandas-docs/stable/merging.html解释如何使用来实现连接concat,但我找不到如何使用成员资格测试作为加入条件。

我错过了什么吗?关于如何做有什么想法吗?


This is unnesting https://stackoverflow.com/questions/53218931/how-do-i-unnest-explode-a-column-in-a-pandas-dataframe先有问题再有merge issue

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]

自定义功能 https://stackoverflow.com/a/53218939/7964527

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')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将两个 pandas DataFrame 合并到包含列表的单元格上 的相关文章

随机推荐