Суммирование текста до после и в круглых скобках в Pandas

#python #pandas #jupyter-notebook

#python #pandas #jupyter-записная книжка

Вопрос:

У меня есть таблица — некоторые со скобками (), а некоторые без

     Companies    
    Arbino (Arb) Corp Ltd
    Arbino (Arb) Corp Ltd; Bakroaho (Bak) Bank
    Zinga
    Zinga; Bakroaho (Bak) Bank
    Bubble Zip (Bzip) Corp
    Bubble Zip (Bzip) Corp; Bakroaho (Bak) Bank
 

Мне нужно создать столбец, подобный этому, то есть текст в круглых скобках И текст после круглых скобок.

 Companies                                   Companies_Compressed
Arbino (Arb) Corp                           Arb Corp Ltd
Arbino (Arb) Corp; Bakroaho (Bak) Bank      Arb Corp Ltd; Bak Bank
Zinga                                       Zinga
Zinga; Bakroaho (Bak) Bank                  Zinga; Bak Bank 
Bubble Zip (Bzip) Corp                      Bzip Corp 
Bubble Zip (Bzip) Corp; Bakroaho (Bak) Bank Bzip Corp; Bak Bank
 

Мне также нужно создать отдельную таблицу, чтобы сообщить всем, что Arbino = Arb

 Company_prefix    short_form  
Arbino            Arb
Bakroaho          Bak
Bubble Zip        Bzip 
 

каково решение?

Ответ №1:

Пожалуйста, замените любые alphanumerics ( or специальные символы перед специальным символом () на '' использование str.replace

 df['Companies_Compressed']=df['Companies'].str.replace('((w s){1,2}(?=[(])|[()])','')
 

По второму вопросу;

 df1=df.assign(Company_prefix=df['Companies'].str.extract('(w sw |w )(?=s[(])'),short_form =df['Companies'].str.extract('(?<=[(])(.*?)(?=[)])')).dropna()
print(df1) 
               
 

Комментарии:

1. Большое спасибо. Первый вопрос, Companies_Compressed, отображается следующим образом: Arbino Arb Corp . Второй вопрос в порядке.

2. Первый вопрос, который работает для меня. Это странно! Попробуйте использовать df['Companies_Compressed']=df['Companies'].str.replace('(w s(?=[(])|[()])','') вместо этого.

3. Это отлично работает. Спасибо. Это не работает, если перед () есть два слова. Например, корпорация Bubble Zip (BZIP) отображается как корпорация Bubble Zip BZIP.

4. Вы правы, это не сработает для `Bubble Zip (BZIP)`. Это было включено в вопрос, хотя

5. Пожалуйста, попробуйте df['Companies_Compressed']=df['Companies'].str.replace('((w s){1,2}(?=[(])|[()])','') ответить на первый вопрос

Ответ №2:

Давайте попробуем это регулярное выражение:

 pattern = '((w )) (w )'
df['Companies_Compressed'] = (df.Companies.str.extractall(pattern)
                                .agg(' '.join, axis=1)
                                .groupby(level=0).apply('; '.join)
                                .fillna(df['Companies'])
                             )

                                Companies Companies_Compressed
0                       Arbino (Arb) Corp             Arb Corp
1  Arbino (Arb) Corp; Bakroaho (Bak) Bank   Arb Corp; Bak Bank
2                                   Zinga                  NaN
 

Комментарии:

1. работает хорошо. Есть ли способ преобразовать, например, для Zinga; Банк Bakroaho (Bak) в Zinga; Банк Bak. Текущий код удаляет zinga. Я отредактировал вопрос.