получить частичную строку, содержащуюся в » ()», из фрейма данных pandas

#python #pandas #dataframe #numpy

Вопрос:

У меня есть df:

       MinMaleTA

28    888(G2M)
29    888(AAM)
30    888(G2M)
31    888(G2M)
32    888(AAM)
33    888(G2M)
34    888(G2M)
35    888(AAM)
36    888(G2M)
37    888(G2M)
38    888(G2M)
39    888(G2M)
40    888(AAM)
41    888(G2M)
42    888(G2M)
43    888(G2M)
 

иногда более 3-значная строка внутри ‘()’,например:

  28 888(G2MPTM) 
 

Как я могу найти строку между ‘()’ в MinMaleTA.

что-то вроде:

 result = df['MinMaleTA'].startwith"(" and endwith")"
 

выходные данные для первых 2 строк должны быть:

 G2M AAM
 

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

1. просто .str[-4:-1] ?

Ответ №1:

Используйте str.extract метод с регулярным выражением:

 >>> df['MinMaleTA'].str.extract(r'((.*))')
      0
28  G2M
29  AAM
30  G2M
31  G2M
32  AAM
33  G2M
34  G2M
35  AAM
36  G2M
37  G2M
38  G2M
39  G2M
40  AAM
41  G2M
42  G2M
43  G2M
 

( и ) соответствовать характеру ( и )

(.*) является группой захвата, которая соответствует любому количеству символов.

Ответ №2:

У вас есть пример использования regex , но если строка всегда имеет одинаковую конструкцию и одинаковый размер внутри ( ) , вы можете нарезать

 "888(G2M)"[-4:-1]

result = df['MinMaleTA'].str[-4:-1]
 

и если он имеет тот же размер снаружи, то вы можете использовать 4 вместо -4

 "888(G2M)"[4:-1]
"888(G2MPTM)"[4:-1]

result = df['MinMaleTA'].str[4:-1]
 

Редактировать:

Вы также можете разделить ( и пропустить последний символ

 "888(G2M)".split("(")[-1][:-1]
"888(G2MPTM)".split("(")[-1][:-1]

df['MinMaleTA'].str.split('(').str[1].str[:-1]    
 

или вы также можете разделить ) , но это создаст более длинный код

 "888(G2M)".split("(")[-1].split(")")[0]
"888(G2MPTM)".split("(")[-1].split(")")[0]

df['MinMaleTA'].str.split('(').str[1].str[:-1]    
 

Если у вас более сложный текст, вы также можете использовать .apply() его для запуска более длинного кода.


Минимальный рабочий пример

 import pandas as pd

df = pd.DataFrame({
    'MinMaleTA': ['888(G2MPTM)', '888(GTM)']
})

result = df['MinMaleTA'].str[4:-1]
print(result)

result = df['MinMaleTA'].str.split('(').str[1].str[:-1]
print(result)

result = df['MinMaleTA'].str.split('(').str[1].str.split(')').str[0]
print(result)

def convert(text):
    #return text[4:-1]
    #return text.split("(")[1][:-1]
    return text.split("(")[1].split(")")[0]

result = df['MinMaleTA'].apply(convert)
print(result)
 

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

1. Спасибо вам за ваш ответ. Не всегда иногда более 3-значной строки внутри ‘()’,например 28 888(G2MPTM)

2. если у вас всегда есть 3 цифры до ( этого, вы можете использовать 4 вместо -4 . Если у вас разные размеры до ( и внутри ( ) , вы также можете использовать split("(") и split(")") .