我有两个数据帧:
第一:df1
df1 = {'NAME': ['A','B','C','D'],
'GROUP': ['A1','B1','C1','D1']
}
df1 = pd.DataFrame(df1,columns=['NAME','GROUP'])
NAME GROUP
0 A A1
1 B B1
2 C C1
3 D D1
第二:df2
df2 = {'NAME': ['AA','AAA','AAAA','BB','BBB','BBBB','CC','CCC','CCCC','DD','DDD','DDDD'],
'GROUP': ['','','','','','','','','','','','']
}
df2 = pd.DataFrame(df2,columns=['NAME','GROUP'])
NAME GROUP
0 AA
1 AAA
2 AAAA
3 BB
4 BBB
5 BBBB
6 CC
7 CCC
8 CCCC
9 DD
10 DDD
11 DDDD
我的任务是根据df1中的NAME在df2中设置GROUP。
我想我需要使用 contains : 如果 df1['NAME'] 在 df2['NAME'] 中,请将 GROUP 设置为 df1['NAME] 中的那个。我尝试使用循环并将 DataFrame 转换为数组,但没有帮助。
答案 0 :(得分:2)
使用 Series.str.extract
创建您可以合并的匹配列。然后带组过来。删除合并前已经存在的 'GROUP'
列,为了清楚起见,我保留了 'match'
列。
在多个子串匹配的情况下,因为它使用了 .str.extract
它将只与第一个子串匹配合并。 (可以使用 .str.extractall
和一些 groupby 处理多个匹配项以将所有内容组合成一个列表。)
pat = '(' + '|'.join(df1['NAME']) +')'
df2['match'] = df2['NAME'].str.extract(pat)
df2 = df2.drop(columns='GROUP').merge(df1.rename(columns={'NAME': 'match'}), how='left')
print(df2)
NAME match GROUP
0 AA A A1
1 AAA A A1
2 AAAA A A1
3 BB B B1
4 BBB B B1
5 BBBB B B1
6 CC C C1
7 CCC C C1
8 CCCC C C1
9 DD D D1
10 DDD D D1
11 DDDD D D1