我在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匹配,我希望在输出中该名称列中使用该文件夹名称
答案 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)
根据您的问题,这是我获得的先决条件
这是我的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。对于大型数据集(数百万个数据点),这可能不是有效的代码。