PYTANIE

Jak filtrować ciągi uśmiecha się, jeśli dowolna litera alfabetyczna (atomy) w ciągu, niewrażliwi na kapitalizację , pochodzą z dataframe elementów H, He, Li, Be, B? Jest to lista ścięta, a ich 80 z nich.

TŁO

Mam bazę danych zawierających ciągi uśmiecha:

Uproszczony system wprowadzania linii molekularnej (uśmiechy) jest specyfikacją w postaci notacji linii do opisywania struktury gatunków chemicznych przy użyciu krótkich ciągów ASCII.

(Więcej informacji Wikipedia Link)

Celem tego było pozbyć się rzadkich elementów i organometalki z bazy danych.

Zaczynam od ciągów, aby przetestować kod przed przejściem do ramy danych. Piszę pętle do przetestowania znaków wewnątrz sznurka.

strings = "[O+]#C[Ni-4](C#[O+])(C#[O+])C#[O+]"
list = ['Ni']
for i in list:
    if i in strings:
        print(i)

Jak iterować przez dataframe i filtr?

0
June 13 październik 2020, 10:45

1 odpowiedź

Najlepsza odpowiedź

W przypadku wersji listy / uproszczonej, wykonaj odwrotnie. Użyj listy, aby znaleźć mecze w ciągach.

strings = "[O+]#C[Ni-4](C#[O+])(C#[O+])C#[O+]"
list = ['Ni', 'Sc']

for i in list:
    if i in strings:
        print(i)
else:
    print('nah')

> Ni
> nah

Do pętli nad dataframe, użyj np.where

df = pd.DataFrame({'smiles': ['sdflk', '[O+]#C[Ni-4](C#[O+])(C#[O+])C#[O+]']})
list = ['Ni', 'Sc']

df['element'] = np.where(df.smiles.str.contains('|'.join(list)), 1, 0) # mark element that contains string in the list as 1, else 0
df[df['element'] == 1] # remove rows that have the element

Należy pamiętać, że byłoby to problematyczne, gdy dataframe zawiera Sc1 jak łańcuch, gdzie S i c faktycznie oznacza siarkę i węgiel na prostym pierścieniu aromatycznym, a nie skandum {x3}}. Potrzebujemy więc sposobu na rozpoznanie Sc tylko i tylko wtedy, gdy nie ma żadnego numeru do niego dołączonego. negatywne lookhead pomoże nam tutaj.

df['Sc'] = df['smiles'].str.match('Sc(?!\d)')
1
June 14 październik 2020, 05:40