Błąd w pętli IF

Błąd w pętli IF
prociusiek x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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

superdurszlak
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 2002
2

if to nie pętla.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
3

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

Kopiuj
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:

Kopiuj
('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:

Kopiuj
'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"]

prociusiek x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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:

Kopiuj
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 :(

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

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

prociusiek x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

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

prociusiek x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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?

superdurszlak
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 2002
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

prociusiek x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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ę

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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

Kopiuj
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.

superdurszlak
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 2002
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):

Kopiuj
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ć

prociusiek x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
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ę:

Kopiuj
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.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

To zamknij to w funkcji:

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.