簡體   English   中英

如何根據 Pandas 中的一列列表組合兩個數據幀

[英]How can I combine two dataframes based on a column of lists in 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

df中帶有xy的行具有 lsit [1,3] df2B列中有一行值為1 C列在該行中具有值pq ,因此我將xypq結合使用。 接下來的兩行也一樣。 最后一行: df2B列中沒有 2 的值,所以我 go 為值6df的最后一行有列表[2,6] )。


問題

如何在不迭代 dataframe 的情況下實現這一目標?


一個非常相似的西班牙語 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

同時,我們可以使用左合並的解決方法,如上所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM