Błąd w pętli IF

0

Cześć, pytanie trochę głupie, bo niby to podstawy Pythona, ale nie działa mi wyrażenie logiczne, które według mnie, powinno działać.
if ('Java' or 'PHP') in row:
mianowicie python wykonuje polecenie, które ma wykonać ta pętla, ale tylko dla pierwszego wyrażenia, w tym wypadku, gdy znajdzie w wierszu słowo 'Java'. Gdy zmienię wyrażenie na takie:
if 'Java' in row or 'PHP' in row:
Wtedy wszystko działa, ale wygląda to słabo. Ma ktoś pomysł co tu może być nie tak?
Pozdrawiam

2

if to nie pętla.

3

Pobawmy się w interpreter Pythona i zobaczmy w jaki sposób analizuje on Twój kod; zaczynamy z:

if ('Java' or 'PHP') in row:

Jak widać, mamy do czynienia z instrukcją warunkową - aby sprawdzić czy powinniśmy wykonać jej ciało, musimy zewaluować ("uruchomić" / "policzyć") wyrażenie:

('Java' or 'PHP') in row

Pierwszym w kolejności operatorem jest in, który przyjmuje dwa argumenty - zanim policzymy wartość samego in, musimy policzyć wartości obydwu jego argumentów; zacznijmy od lewej strony:

'Java' or 'PHP'

Whoops - no i mamy błąd: ile wynosi wartość wyrażenia 'Java' or 'PHP'? Czy to wyrażenie ma w ogóle sens?

tl;dr powinieneś mieć row in ["Java", "PHP"]

0

Rzeczywiście, pomyliło mi się z pętlą for, bo instrukcja warunkowa if znajduje się w pętli for, której nie wrzuciłem w tym poście ;)
Wracając do tematu, całość wygląda tak:

for row in df['Job title']:
    if row in ['JAVA', 'PHP']:
        job_category.append('backend')

Zmieniłem wyrażenie logiczne tak jak poleciłeś, natomiast teraz w ogóle nie pokazuje żadnych wyników :(

0

Dlaczego wykorzystujesz dwa razy tę samą zmienną? (tj. dwa razy row)

0

Bo pracuję na DataFrame i chcę stworzyć skrypt, który szuka po każdym wierszu czy w kolumnie 'Job title' występuje słowo takie jak JAVA albo PHP

0

Ok, a dlaczego wykorzystujesz dwa razy tę samą zmienną? (tj. dwa razy row zamiast np. row1 i row2)

0

Nie rozumiem za bardzo pytania ;/ Gdybym użył zmiennch row1 i row2 to ten skrypt w ogóle by nie działał. Inne skrypty robiłem podobnie do tego i zawsze działało wszystko dobrze. Ja to rozumiem w ten sposób, że zmienna row przyjmuje wartość każdego wiersza po kolei i gdy znajdzie określony tekst w kolumnie to wykona polecenie poniżej. Czy coś zrozumiałem nie tak?

1

Jeśli pracujesz na DataFrame, absolutnie nie ma sensu robić tego w pętli. Do tego możesz użyć DataFrame.filter lub DataFrame.loc

0

Owszem, tylko zauważ, że nie chodzi mi o samo wyszukanie, a o to, że gdy wyszuka taki tekst to żeby wrzuciło napis 'Backend' do nowej listy, z której później robię kolumnę

1

Błąd teraz polega na tym że warunek row in ["JAVA", "PHP"] sprawdza czy row jest równy dokładnie któremuś z tych słów, a przecież nie o to chodziło. Musiałbyś jednak miec

for keyword in ["JAVA", "PHP"]:
    if keyword in row:
        # cośtam

Bo przeciez dla każdego ze słów kluczowych chcesz sprawdzić czy wystąpiło w row.

0
prociusiek x napisał(a):

Owszem, tylko zauważ, że nie chodzi mi o samo wyszukanie, a o to, że gdy wyszuka taki tekst to żeby wrzuciło napis 'Backend' do nowej listy, z której później robię kolumnę

Tego nie widzimy, bo nie powiedziałeś co chcesz zrobić.

W takim razie potrzebujesz DataFrame.loc - umożliwia modyfikację odfiltrowanych wierszy DataFrame. Możesz dorzucić sobie kolumnę job_category, odfiltrować w loc i uzupełnić mniej więcej tak (piszę z pamięci, nie używałem pandas od dość dawna):

df.loc[<wyrażenie>]['job_category'] = 'backend'

Tutaj masz dokumentację: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc

jeśli pamiętam, sprawdzanie czy zawartość wiersza zawiera się w liście / zbiorze / krotce było tricky i takie zwykłe x in [y, z] nie działało z loc, ale dało się to zrobić

0

Znaczy tak jak napisałem na początku tego posta, chciałem aby skrypt wyszukiwał czy słowo "JAVA" lub słowo "PHP" występuje w danym wierszu, jeśli tak to wpisuje słowo "Backend" do listy. Wyrażenie logiczne, którego używam działa wtedy gdy użyję:

for row in df['Job title']:
    if  'JAVA' in row or 'PHP' in row:
        job_category.append('backend')

Natomiast chciałbym, żeby oba słowa zamknąć w jednym nawiasie. Dodam, że pętla, którą zaproponowałeś nie do końca mnie satysfakcjonuje, ponieważ mam także plan, żeby do listy były dopisywane także inne słowa, które spełnią inny warunek. Problem mam z samym zbudowaniem wyrażenia logicznego.

0

To zamknij to w funkcji:

def is_names_in_row(names, row):
	"""names: list of strings
	returns True if one of the names in row
	else returns False"""
	# TODO

1 użytkowników online, w tym zalogowanych: 0, gości: 1