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
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
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? –
@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