У меня есть фрейм данных со столбцом под названием «ИНФОРМАЦИЯ», содержащим строку, разделенную точкой с запятой, как показано ниже. Я хотел бы проанализировать строку, чтобы вернуть значения, соответствующие определенным подстрокам, и назначить ее новому столбцу.
БЫВШИЙ. В приведенной ниже таблице я хотел бы присвоить значение (после знака равенства) для «CLNDISDB» столбцу с тем же именем.
Я пытался:
df['INFO'].str.split(';',expand=True)
который назначил каждую часть строки новому столбцу, но это все равно потребовало бы от меня анализа каждого столбца для необходимой строки. Любая помощь будет принята с благодарностью.
Я могу использовать только стандартные библиотеки Python
| | INFO |
|----|---------------------------------------------------|
| 0 | AF_ESP=0.00546;AF_EXAC=0.00165;AF_TGP=0.00619;... |
| 1 | AF_ESP=0.00015;AF_EXAC=0.00010;ALLELEID=514926... |
| 2 | ALLELEID=181485;CLNDISDB=MedGen:C4015293,OMIM:... |
| 3 | ALLELEID=514896;CLNDISDB=MedGen:C4015293,OMIM:... |
| 4 | AF_ESP=0.00515;AF_EXAC=0.00831;AF_TGP=0.00339;... |
| 5 | AF_ESP=0.40158;AF_EXAC=0.37025;AF_TGP=0.33886;... |
| 6 | ALLELEID=556509;CLNDISDB=MedGen:C4015293,OMIM:... |
| 7 | ALLELEID=556512;CLNDISDB=MedGen:C4015293,OMIM:... |
| 8 | ALLELEID=171289;CLNDISDB=MedGen:C4015293,OMIM:... |
| 9 | AF_EXAC=0.00001;ALLELEID=171288;CLNDISDB=MedGe... |
| 10 | AF_ESP=0.00038;AF_EXAC=0.00036;AF_TGP=0.00060;... |
| 11 | AF_ESP=0.00987;AF_EXAC=0.00772;AF_TGP=0.01558;... |
| 12 | AF_ESP=0.00070;AF_TGP=0.00080;ALLELEID=446981;... |
| 13 | AF_EXAC=0.00038;ALLELEID=446941;CLNDISDB=MedGe... |
| 14 | AF_EXAC=0.00114;AF_TGP=0.00958;ALLELEID=364282... |
| 15 | ALLELEID=556516;CLNDISDB=MedGen:C3808739,OMIM:... |
| 16 | AF_EXAC=0.00024;ALLELEID=364148;CLNDISDB=MedGe... |
| 17 | ALLELEID=514900;CLNDISDB=MedGen:C3808739,OMIM:... |
| 18 | AF_EXAC=0.42418;AF_TGP=0.28255;ALLELEID=133759... |
| 19 | ALLELEID=364285;CLNDISDB=MedGen:CN169374;CLNDN... |
Догадаться. Работает хорошо, нужно немного подчистить результаты и убрать лишний пробел и запятую.
def my_func(x):
return [value.split("CLNDISDB = ",1) for value in x.split(';') if 'CLNDISDB' in value]
df['CLNDISDB'] = [my_func(x) for x in df['INFO'].values]
Это было весело, так что настройка фрейма данных
import re
import pandas as pd
import numpy as np
test = {'INFO':['AF_EXAC=0.42418;AF_TGP=-0.28255;ALLELEID=133759', 'foo','AF_EXAC=-0.42418;AF_TGP=0.28255;ALLELEID=133759']}
df=pd.DataFrame(test)
мы получаем
INFO
0 AF_EXAC=0.42418;AF_TGP=-0.28255;ALLELEID=133759
1 foo
2 AF_EXAC=-0.42418;AF_TGP=0.28255;ALLELEID=133759
Теперь, используя лямбда-функцию и условное выражение, мы просто извлекаем значения для «AF_TGP». Создавая новый столбец, мы извлекаем число из шаблона регулярного выражения, окружающего значение. Но мы запускаем регулярное выражение только тогда, когда оно будет передавать текст, используя функцию in
в python.
df['a'] = df['INFO'].apply(lambda x: re.search(r'AF_TGP=(?P<number>[+-]?\d+\.\d+);', str(x)).group('number') if 'AF_TGP' in str(x) else np.nan)
это дает результат
INFO a
0 AF_EXAC=0.42418;AF_TGP=-0.28255;ALLELEID=133759 -0.28255
1 foo NaN
2 AF_EXAC=-0.42418;AF_TGP=0.28255;ALLELEID=133759 0.28255