2014-12-31 17 views
5

Cześć wam mam spojrzeć na całym SO i google i nie mogę znaleźć coś podobnego ...Pandy: np.where z wielu warunków dotyczących dataframes

Mam X dataframe (zasadniczo składają się z jednego rzędu i 300 kolumnach) i inna ramka danych y o tym samym rozmiarze, ale o innych danych. Chciałbym zmodyfikować x tak, aby było 0, jeśli ma inny znak do y ORAZ x nie jest równe 0, w przeciwnym razie zostaw to takim, jakie jest. więc wymaga to użycia np.where z wieloma warunkami. Jednak w wielu przykładach warunków, które widziałem, wszystkie używają skalarów, a kiedy używam tej samej składni, wydaje się, że nie działa (kończy się ustawienie - wszystko - zero, brak błędu). Martwię się, że problemy z przypisaniem przez referencje są ukryte gdzieś lub indziej (y jest po przesunięciu, ale o ile mogę powiedzieć, że nie ma problemu z wyższego poziomu nad tym kodem) żadnych pomysłów?

kod próbuję debugowania jest:

tradesmade[i:i+1] = np.where((sign(x) != sign(y)) & (sign(x) != 0), 0, x) 

który właśnie wraca kilka zer. Próbowałem także

ale to też nie działa. Byłem w tym od wielu godzin i jestem totalnie przegrany. proszę pomóż!

+2

Dlaczego używasz jednowierszowej, 300-kolumnowej DataFrame zamiast Serii? – BrenBarn

+0

hah tak, powinienem przewidzieć to pytanie. I rzeczywiście iteracji przez> 3000 wierszy tej ramce danych, jednak każde obliczenie zależy od wyników z poprzednich wierszy, a więc trzeba przejść jeden wiersz na raz. Wiem o wadze i szybkości wektoryzacji, ale pierwszeństwo w uzyskaniu odpowiedzi na to pytanie (co też wydaje się nieskuteczne w ...) – swyx

+0

Klauzula "sign (x)! = 0" jest niepotrzebna. – acushner

Odpowiedz

11

To nie jest dla mnie jasne, co dokładniechce zrobić, gdy element y jest równa zeru ... W każdym razie kluczowym punktem w tej odpowiedzi jest „stosowanie np.logical_{and,not,or,xor} funkcje”.

myślę który dodaje, choć sformułowane odmiennie od Twojego przykład, czy to, co chcesz, ale jeśli się mylę powinieneś być w stanie połączyć różne testy, aby osiągnąć to, co chcesz,

x = np.where(np.logical_or(x*y>0, y==0), x, 0) 
+1

Zajęło ci sporo czasu, aby rozpoznać absolutną wielkość mojej odpowiedzi, ale w końcu ją zaakceptowałeś! ... Poważnie: dziękuję za poświęcenie czasu, aby wrócić i zaznaczyć tę odpowiedź ... – gboffi

+0

haha ​​Nie byłem wówczas bardzo aktywnym użytkownikiem SO. ponieważ zrobiłem to ponownie z moją odpowiedzią na twój komentarz. Zastanawiam się, jak długo możemy to utrzymać – swyx

4

Podobne do postu @gboffi, ale bardziej scentralizowane dla pierwotnego wniosku zgodnie z moim rozumieniem Spróbuj:

x = np.where(np.logical_and((x*y) < 0, x != 0)) 

lub

x = np.where(((x*y) < 0) & (x != 0))) 
+0

dzięki, wznowione :) – swyx

Powiązane problemy