[英]Join two data frames by searching & matching exactly same strings
我有兩個 python 數據幀:其中一個有一個列有一個行'AC-2'另一個數據幀包括有一個字符串行'AC-20,AC8,AC-15'的列
str_match = "({})".format("|".join(df1['column_first_dataframe']))
df2.merge(df2,how='left',left_on=df1['column_first_dataframe'].str.extract(str_match)[0], right_on="column_second_dataframe")
第一個數據集:
Column1 Column2
AC-2 2
AC-20 1
AC-15 3
AC-1 2
AC-5 5
第二個數據集:
Column1
AC-2,AC-5,AC-30
AC-20,AC-30,AC11
我發現:
Column1 Column2
AC-2 AC-20,AC-30,AC11
AC-2 AC-2,AC-5,AC-30
AC-20 AC-20,AC-30,AC11
AC-15 null
AC-1 null
AC-5 AC-2,AC-5,AC-30
上面有數據集 1 的 AC-2 和數據集 2 的字符串中的 AC-20 之間的匹配,但它們在我的數據集中是不同的東西。 我想要的 output:
Column1 Column2
AC-2 AC-2,AC-5,AC-30
AC-20 AC-20,AC-30,AC11
AC-15 null
AC-1 null
AC-5 AC-2,AC-5,AC-30
我試圖通過搜索和匹配來合並數據幀,但我的代碼將 AC-2 合並到 AC-20。 我不想那樣做。 是否有任何搜索和匹配方法可以完全合並我想要的數據框。 我不想合並 AC-20 和 AC-2。 它應該將 AC-2 和 AC-2 與完全相同的東西合並。
感謝您的貢獻!
一種簡單的方法是split
和分解explode
的 Column2 以獲得每個完整單詞的一行並執行簡單的左merge
。
(df1
.merge(df2.assign(group=df2['Column1'].str.split(','))
.rename(columns={'Column1': 'Column3'})
.explode('group'),
left_on='Column1', right_on='group', how='left'
)
.drop(columns='group')
)
output:
Column1 Column2 Column3
0 AC-2 2 AC-2,AC-5,AC-30
1 AC-20 1 AC-20,AC-30,AC11
2 AC-15 3 NaN
3 AC-1 2 NaN
4 AC-5 5 AC-2,AC-5,AC-30
注意。 我正在生產稍有不同的 output 以保留所有列。 如果你真的想要你的 output,只需在 df1 中刪除“Column2”,然后在 df2 中將“Column1”重命名為“Column2”
(df1
.drop(columns='Column2')
.merge(df2.rename(columns={'Column1': 'Column2'})
.assign(Column1=df2['Column1'].str.split(','))
.explode('Column1'),
on='Column1', how='left'
)
)
output:
Column1 Column2
0 AC-2 AC-2,AC-5,AC-30
1 AC-20 AC-20,AC-30,AC11
2 AC-15 NaN
3 AC-1 NaN
4 AC-5 AC-2,AC-5,AC-30
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.