我有两个df
,
df1
id group
1 0001
2 0001
3 0001
4 0002
5 0002
6 0003
df2
group name
0001 one
0002 one
0003 two
我试图看看name
是否在df2
中包含one
,并在df1
中找到相应的group
;然后合并df1
和df2
;
a = df2['name'].str.contains(pat=r'(?i)one', regex=True)
valid_groups = df2.loc[a]['group'].tolist()
c = df1['group'].isin(valid_groups)
df3 = df1.loc[c]
df4 = df3.merge(df2, how='left', on=['group'])
group name id
0001 one 1
0001 one 2
0001 one 3
0002 one 4
0002 one 5
我想知道是否有更好的方法可以做到这一点,更有效的方法。
如果只需要merge
一列,则使用map
更快:
a = df2['name'].str.contains(pat=r'(?i)one', regex=True)
valid_groups = df2[a].copy()
df = df1[df1['group'].isin(valid_groups['group'])].copy()
df['name'] = df['group'].map(valid_groups.set_index('group')['name'])
print (df)
id group name
0 1 0001 one
1 2 0001 one
2 3 0001 one
3 4 0002 one
4 5 0002 one
您可以使用:
df2.merge(df1,on='group').loc[lambda x: x.name=='one']
#df2.merge(df1,on='group').loc[lambda x: x.name.str.contains(pat=r'(?i)one', regex=True)]
或:
df2.merge(df1,on='group').query("name=='one'")