在python中使用公共列和字符串条件合并两个熊猫数据帧

时间:2018-12-19 16:34:53

标签: python python-3.x pandas dataframe data-science

我在python中有两个dfs:

{path:':bot/:code/:place', component:botComponent}

所需的输出:

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')

因此,如果df2名称列中的前缀字符串与df1中的任何名称列itme匹配,我希望在输出中该名称列中使用该文件夹名称

2 个答案:

答案 0 :(得分:1)

我会为前缀添加一列,然后合并,然后在以下位置删除该列:(请注意,这仅在所有数据均与您发布时相同,且前缀为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 :(得分:1)

根据您的问题,这是我获得的先决条件

  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。对于大型数据集(数百万个数据点),这可能不是有效的代码。