Błąd w pętli IF

Błąd w pętli IF
prociusiek x
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • 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:prawie 7 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Kraków
  • Postów:2000
2

if to nie pętla.


PerlMonk
To co, antypętla? Albo pętla z jednym przejściem.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • 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"]


edytowany 9x, ostatnio: Patryk27
Shalom
Zauważ ze on chce sprawdzić czy row zawiera któreś z tych słów, a nie czy jest dokładnie równe.
prociusiek x
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • 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 :(

edytowany 1x, ostatnio: Patryk27
Patryk27
Pamiętaj o umieszczaniu kodu w załącznikach :-)
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


prociusiek x
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • 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
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • 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)


edytowany 1x, ostatnio: Patryk27
prociusiek x
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • 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?

Patryk27
Ach, dopiero teraz zauważyłem, co próbujesz zrobić, nevermind :-P
superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Kraków
  • Postów:2000
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:ponad 4 lata
  • Ostatnio:około 3 lata
  • 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:około 21 lat
  • Ostatnio:prawie 3 lata
  • 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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Kraków
  • Postów:2000
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ć


edytowany 2x, ostatnio: superdurszlak
prociusiek x
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • 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:około 8 lat
  • Ostatnio:11 minut
  • Postów:4927
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.