#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(")")
.