#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