[英]Merge two pandas dataframes in python with a common column and with condition on string
我在python中有兩個df:
df1
folder_name name
0 f1 aa
1 g1 bb
df2
name icon
0 aa i1
1 bb i2
2 aadoq i3
3 bbaddd i4
所需的輸出:
df
folder_name name icon
0 f1 aa i1
1 g1 bb i2
2 f1 aadoq i3
3 g1 bbaddd i4
我嘗試合並它們,但似乎不對
pd.merge(df1,df2,on='name',how='right')
我正進入(狀態 :
folder_name name icon
0 f1 aa i1
1 g1 bb i2
2 NAN aadoq i3
3 NAN bbaddd i4
因此,如果df2名稱列中的前綴字符串與df1中的任何名稱列itme相匹配,我希望該文件夾名稱在輸出中用於該名稱列
我會為前綴添加一個列,然后合並,然后在以下位置刪除該列:(注意,僅當所有數據都與您發布的一樣,且前綴為2個字符)
df1=pd.DataFrame({'folder_name':['f1','d1'],'name':['aa','bb']})
df2=pd.DataFrame({'name':['aa','bb','aaq','bbdfg'],'icon':[1,2,3,4]})
df2['prefix']=df2['name'].str[:2]
name icon prefix
0 aa 1 aa
1 bb 2 bb
2 aaq 3 aa
3 bbdfg 4 bb
df3=df2.merge(df1, left_on='prefix', right_on='name').drop(['name_y','prefix'], axis=1)
df3
name_x icon folder_name
0 aa 1 f1
1 aaq 3 f1
2 bb 2 d1
3 bbdfg 4 d1
根據您的問題,這是我獲得的先決條件
這是我的Python代碼。 我使用了Python regex模塊。 我從兩個數據框中選擇了“名稱”列表,檢查數據框1中的任何名稱是否與數據框2中的名稱匹配(python regex中的match表示從字符串開頭開始匹配)。 根據這些條件(存在匹配項)創建一個名為MappedName的新列表,如果不使用,則使用數據框1中的匹配名稱值,使用數據框2中的名稱值。將此列表作為新列添加到數據框2。使用“名稱”數據框1的“列”列和數據框2的“ MappedName”列用於合並條件。
我在數據框2中添加了一個額外的數據點,以顯示與正則表達式不匹配時發生的情況。
from pandas import DataFrame
import re
df1=DataFrame({'folder_name':['f1','g1'],'name':['aa','bb']})
df2=DataFrame({'name':['aa','bb','aadoq','bbaddd','ding'],'icon':['i1','i2','i3','i4','i5']})
df1_name_list=df1['name']
df2_name_list=df2['name']
MappedName=[]
for name2 in df2_name_list:
for name1 in df1_name_list:
if re.match(name1,name2):
name2=name1
break
MappedName.append(name2)
df2['MappedName']=MappedName
df3=df1.merge(df2,left_on='name',right_on='MappedName',how='right').drop(['name_x','MappedName'],axis=1)
df4=df1.merge(df2,left_on='name',right_on='MappedName').drop(['name_x','MappedName'],axis=1)
print ('\ndf1\n',df1)
print ('\ndf2\n',df2)
print ('\ndf3\n',df3)
print ('\ndf4\n',df4)
結果如下
df1
folder_name name
0 f1 aa
1 g1 bb
df2
name icon MappedName
0 aa i1 aa
1 bb i2 bb
2 aadoq i3 aa
3 bbaddd i4 bb
4 ding i5 ding
df3
folder_name name_y icon
0 f1 aa i1
1 f1 aadoq i3
2 g1 bb i2
3 g1 bbaddd i4
4 NaN ding i5
df4
folder_name name_y icon
0 f1 aa i1
1 f1 aadoq i3
2 g1 bb i2
3 g1 bbaddd i4
如果合並時需要NaN並且沒有匹配項,請使用df3示例,否則使用df4。 對於大型數據集(數百萬個數據點),這可能不是有效的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.