Как установить значение в столбце в соответствии со значением другого столбца фрейма данных

#python #pandas #for-loop

#питон #панды #for-цикл

Вопрос:

У меня есть два фрейма данных:

Первый: 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    
 

Моя задача — установить ГРУППУ в df2 в соответствии с ИМЕНЕМ в df1.

Я думаю, мне нужно использовать contains: ЕСЛИ df1[‘NAME’] находится в df2[‘NAME’], установите для группы значение в df1[‘NAME]. Я попытался использовать цикл и преобразовать фрейм данных в массивы, но это не помогло.

Ответ №1:

Используется 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