如何根据Pandas中的一列列表组合两个数据框

import pandas as pd

可重现的设置

我有两个数据框:

df=
pd.DataFrame.from_dict({'A':['xy','yx','zy','zz'],
                        'B':[[1, 3],[4, 3, 5],[3],[2, 6]]})

df2=
pd.DataFrame.from_dict({'B':[1,3,4,5,6],
                        'C':['pq','rs','pr','qs','sp']})

df 好像:

    A          B
0  xy     [1, 3]
1  yx  [4, 3, 5]
2  zy        [3]
3  zz     [2, 6]

df2 好像:

   B   C
0  1  pq
1  3  rs
2  4  pr
3  5  qs
4  6  sp

目的

我想将这两者结合起来形成res

res=
pd.DataFrame.from_dict({'A':['xy','yx','zy','zz'],
                        'C':['pq','pr','rs','sp']})

IE

    A   C
0  xy  pq
1  yx  pr
2  zy  rs
3  zz  sp

带有xyin的行df有 lsit [1,3]1中的列B中有一行带有值df2。该C列具有值pq该行中,所以我结合xy使用pq。接下来的两行相同。最后一行:in 列B中没有 2 的值df2,所以我选择该值6(indf中的最后一行有 list [2,6])。


如何在不遍历数据帧的情况下实现这一目标?


西班牙语 SO 中的一个非常相似的帖子,启发了这篇文章。

回答

您可以将explode“B”分成单独的行,然后在“B”上合并并删除重复项。

非常感谢 Asish M. 在评论中指出了一个潜在的排序错误。

(df.explode('B')
   .merge(df2, on='B', how='left')
   .dropna(subset=['C'])
   .drop_duplicates('A'))

    A  B   C
0  xy  1  pq
2  yx  4  pr
5  zy  3  rs
7  zz  6  sp

理想情况下,以下应该有效:

df.explode('B').merge(df2).drop_duplicates('A')

但是,pandas(截至撰写时,版本 1.2dev)不会保留合并时左键的顺序,这是一个错误,请参阅 GH18776。

同时,我们可以使用左合并的解决方法,如上所示。

  • a left join with `dropna` followed by `drop_duplicates` fixes this

以上是如何根据Pandas中的一列列表组合两个数据框的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>