如何根据另一个数据框列的值在列中设置值

时间:2021-01-04 19:45:38

标签: python pandas for-loop

我有两个数据帧:

第一: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 转换为数组,但没有帮助。

1 个答案:

答案 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