[英]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]
。 df2
的B
列中有一行值為1
。 C
列在該行中具有值pq
,因此我將xy
與pq
結合使用。 接下來的兩行也一樣。 最后一行: df2
的B
列中沒有 2 的值,所以我 go 為值6
( df
的最后一行有列表[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.