2014-05-01 12 views
7

Wiem, jak utworzyć nową kolumnę z apply lub np.where w oparciu o wartości innej kolumny, ale sposób selektywnej zmiany wartości istniejącej kolumny jest uciążliwy; Podejrzewam, że w grę wchodzi df.ix? Czy jestem blisko?Pandy modyfikują wartości kolumn na miejscu w oparciu o tablicę boolowską

Na przykład tutaj jest prosta ramka danych (moja ma dziesiątki tysięcy wierszy). Chciałbym, aby zmienić wartość na „flaga” kolumny (powiedzmy do „Blue”), jeśli nazwa kończy się na literę „E”:

>>> import pandas as pd 
>>> df = pd.DataFrame({'name':['Mick', 'John', 'Christine', 'Stevie', 'Lindsey'], \ 
     'flag':['Purple', 'Red', nan, nan, nan]})[['name', 'flag']] 
>>> print df 

     name flag 
0  Mick Purple 
1  John  Red 
2 Christine  NaN 
3  Stevie  NaN 
4 Lindsey  NaN 
[5 rows x 2 columns] 

mogę zrobić logiczną serię z moich kryteriów:

>boolean_result = df.name.str.contains('e$') 
>print boolean_result 
0 False 
1 False 
2  True 
3  True 
4 False 
Name: name, dtype: bool 

Muszę tylko kluczowy krok, aby uzyskać następujący wynik:

>>> print result_wanted 
     name flag 
0  Mick Purple 
1  John  Red 
2 Christine Blue 
3  Stevie Blue 
4 Lindsey  NaN 

Odpowiedz

11
df['flag'][df.name.str.contains('e$')] = 'Blue' 
+0

to jest dokładnie to! Całkowicie zastanawiałem się nad tym; po raz kolejny pandy są eleganckie, gdy przyjmuję, że to musi być skomplikowane. Dzięki! – prooffreader

+2

Myślałem, że ten rodzaj przykutego zadania nie był zalecany? Ja prawie zawsze używam .loc, gdy znalazłem kilka bardzo dziwnych efektów tego rodzaju zadań. Mam na myśli, że wyraźnie tu działa, ale generalnie miałem wrażenie, że należy tego unikać. Czy to twoje zrozumienie? –

+2

@WoodyPride Do indeksowania z wektorami boolowskimi jest to całkowicie w porządku, jeśli chcesz dodać inne formy indeksowania, potrzebujesz 'loc'. Na przykład: 'df.loc [df.name.str.contains ('e $'), 'flag'] = 'Blue''. Masz rację, obawiając się poglądów kontra kopii. Odwracanie kolejności dostępu (dla mnie) powoduje błąd: 'df [df.name.str.contains ('e $')] ['flag'] = 'Blue'' – U2EF1

Powiązane problemy