Próbuję zastąpić wartości w jednej kolumnie ramki danych. Kolumna („kobieta”) zawiera tylko wartości „kobieta” i „mężczyzna”.
Próbowałem następujących rzeczy:
w['female']['female']='1'
w['female']['male']='0'
Ale otrzymaj dokładnie tę samą kopię poprzednich wyników.
Idealnie chciałbym uzyskać wyjście, które przypomina elementarną pętlę.
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
Przejrzałem dokumentację gotchas ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ), ale nie mogę zrozumieć, dlaczego nic się nie dzieje.
Każda pomoc zostanie doceniona.
.loc
składni, aby uniknąćSettingWithCopyWarning
: pandas.pydata.org/pandas-docs/stable/...Możesz edytować podzbiór ramki danych, używając loc:
W tym przypadku:
źródło
Zobacz dokumentację pandas.DataFrame.replace () .
źródło
Drobna różnica:
źródło
Powinno to również działać:
źródło
Możesz także używać
apply
z.get
npw['female'] = w['female'].apply({'male':0, 'female':1}.get)
:Ramka danych
w
:Używanie
apply
do zamiany wartości ze słownika:Wynik:
Uwaga:
apply
ze słownikiem należy używać, jeśli wszystkie możliwe wartości kolumn w ramce danych są zdefiniowane w słowniku else, będzie miał puste dla tych, które nie są zdefiniowane w słowniku.źródło
To jest bardzo kompaktowe:
Kolejny dobry:
źródło
Alternatywnie istnieje wbudowana funkcja pd.get_dummies dla tego rodzaju przypisań:
W ten sposób otrzymasz ramkę danych z dwiema kolumnami, po jednej dla każdej wartości występującej w w ['female'], z których usuwasz pierwszą (ponieważ można ją wywnioskować z tej, która została). Nowa kolumna zostanie automatycznie nazwana jako zastąpiony ciąg.
Jest to szczególnie przydatne, jeśli masz zmienne kategorialne z więcej niż dwiema możliwymi wartościami. Ta funkcja tworzy tyle zmiennych fikcyjnych, ile potrzeba do rozróżnienia wszystkich przypadków. Uważaj więc, aby nie przypisać całej ramki danych do pojedynczej kolumny, ale zamiast tego, jeśli w ['żeński'] może być 'męski', 'żeński' lub 'neutralny', zrób coś takiego:
Następnie masz dwie nowe kolumny dające fikcyjne kodowanie „kobieta” i pozbyłeś się kolumny ze stringami.
źródło
Korzystanie
Series.map
zSeries.fillna
Jeśli kolumna zawiera więcej ciągów niż tylko
female
imale
,Series.map
w tym przypadku zakończy się niepowodzeniem, ponieważ zwróciNaN
inne wartości.Dlatego musimy połączyć to z
fillna
:Przykład dlaczego
.map
zawodzi :Dla właściwej metody, łańcuch
map
zfillna
, więc wypełnićNaN
wartościami z kolumny oryginalnej:źródło
Istnieje również funkcja
pandas
nazwana,factorize
której możesz użyć do automatycznego wykonania tego typu pracy. Przetwarza on etykiety z numerami:['male', 'female', 'male'] -> [0, 1, 0]
. Zobacz tę odpowiedź, aby uzyskać więcej informacji.źródło
Myślę, że w odpowiedzi należy wskazać, jaki typ obiektu otrzymujesz we wszystkich sugerowanych powyżej metodach: czy to Series czy DataFrame.
Kiedy otrzymasz kolumnę według
w.female.
lubw[[2]]
(gdzie, załóżmy, że 2 to numer Twojej kolumny), otrzymasz z powrotem DataFrame. W tym przypadku możesz użyć metod DataFrame, takich jak.replace
.Podczas korzystania
.loc
alboiloc
wrócisz Series, a seria nie ma.replace
sposobu, więc należy użyć metod, takich jakapply
,map
i tak dalej.źródło