簡體   English   中英

在python中使用公共列和字符串條件合並兩個熊貓數據幀

[英]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

根據您的問題,這是我獲得的先決條件

  1. Python(我使用的是版本3,但與版本2並沒有太大區別)
  2. 熊貓數據框
  3. 文件夾名稱不限於length = 2

這是我的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.

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