Załóżmy, że mam pandę DataFrame z dwiema kolumnami, A i B. Chciałbym zmodyfikować tę ramkę DataFrame (lub utworzyć kopię), aby B zawsze miało wartość NaN, gdy A wynosi 0. Jak mogę to osiągnąć?
Wypróbowałem następujące
df['A'==0]['B'] = np.nan
i
df['A'==0]['B'].values.fill(np.nan)
bezskutecznie.
where
jak widać na poniższym rozwiązaniuOdpowiedzi:
Użyj
.loc
do indeksowania na podstawie etykiet:df.A==0
Ekspresji tworzy logiczną serii, które indeksów wierszy,'B'
wybiera kolumny. Możesz również użyć tego do przekształcenia podzbioru kolumny, np .:Nie wiem wystarczająco dużo o elementach wewnętrznych pand, aby dokładnie wiedzieć, dlaczego to działa, ale podstawowym problemem jest to, że czasami indeksowanie do DataFrame zwraca kopię wyniku, a czasami zwraca widok oryginalnego obiektu. Zgodnie z dokumentacją tutaj zachowanie to zależy od podstawowego zachowania numpy. Zauważyłem, że dostęp do wszystkiego w jednej operacji (zamiast [jednej] [dwóch]) jest bardziej prawdopodobny dla ustawienia.
źródło
Oto dokumentacja pandas dotycząca zaawansowanego indeksowania:
Sekcja wyjaśni dokładnie, czego potrzebujesz! Okazuje się, że
df.loc
(ponieważ .ix został przestarzały - jak wielu wskazało poniżej) może być użyty do fajnego krojenia / kostkowania ramki danych. I. Może być również używany do ustawiania rzeczy.Więc odpowiedź Brena brzmi: „znajdź mi wszystkie miejsca
df.A == 0
, wybierz kolumnęB
i ustaw ją nanp.nan
”źródło
loc[selection criteria, columns I want]
doskonale trzyma się twojego umysłu ...Począwszy od pand w wersji 0.20 ix jest przestarzały . Właściwym sposobem jest użycie df.loc
oto działający przykład
Wyjaśnienie:
Jak wyjaśniono w dokumencie tutaj ,
.loc
jest oparty głównie etykieta, ale może być również używany z logicznej tablicy .Tak więc to, co robimy powyżej, to stosowanie
df.loc[row_index, column_index]
przez:loc
może przyjąć tablicę logiczną jako maskę, która mówi pandom, w którym podzbiorze wierszy chcemy zmienićrow_index
loc
jest również oparte na etykiecie, aby wybrać kolumnę za pomocą etykiety'B'
wcolumn_index
Możemy użyć operacji logicznej, warunkowej lub dowolnej operacji, która zwraca serię wartości logicznych, aby skonstruować tablicę wartości logicznych. W powyższym przykładzie chcemy,
rows
aby zawierała a0
, w tym celu możemy użyćdf.A == 0
, jak widać w przykładzie poniżej, zwraca to serię wartości logicznych.Następnie używamy powyższej tablicy wartości logicznych, aby wybrać i zmodyfikować niezbędne wiersze:
Aby uzyskać więcej informacji, zapoznaj się z zaawansowaną dokumentacją dotyczącą indeksowania tutaj .
źródło
Aby uzyskać ogromny wzrost prędkości, użyj funkcji Where NumPy.
Ustawiać
Utwórz dwukolumnową ramkę DataFrame ze 100 000 wierszy z kilkoma zerami.
Szybkie rozwiązanie dzięki
numpy.where
Czasy
Numpy
where
jest około 4x szybszyźródło
.values
wnp.where(df.a.values == 0, np.nan, df.b.values)
? Wygląda na to, żenp.where(df.a == 0, np.nan, df.b)
też działa?Aby zamienić kolumny wielokrotności, przekonwertuj je na tablicę numpy używając
.values
:źródło