Kolomwaarden vervangen in een panda’s DataFrame

Ik probeer de waarden in één kolom van een dataframe te vervangen. De kolom (‘female’) bevat alleen de waarden ‘female’ en ‘male’.

Ik heb het volgende geprobeerd:

w['female']['female']='1'
w['female']['male']='0' 

Maar ontvang exact dezelfde kopie van de vorige resultaten.

Ik zou idealiter wat output willen krijgen die qua element op de volgende lus lijkt.

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

Ik heb de gotchas-documentatie bekeken (http://pandas.pydata.org/pandas- docs/stable/gotchas.html) maar kan niet achterhalen waarom er niets gebeurt.

Alle hulp wordt op prijs gesteld.


Antwoord 1, autoriteit 100%

Als ik het goed begrijp, wil je zoiets als dit:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(Hier converteer ik de waarden naar getallen in plaats van tekenreeksen die getallen bevatten. Je kunt ze converteren naar "1"en "0", als je echt wilt, maar Ik weet niet zeker waarom je dat zou willen.)

De reden dat uw code niet werkt, is omdat u ['female']op een kolom gebruikt (de tweede 'female'in uw w['female']['female']) betekent niet “selecteer rijen waar de waarde ‘female’ is”. Het betekent rijen selecteren waar de index‘vrouwelijk’ is, waarvan er mogelijk geen in uw DataFrame staat.


Antwoord 2, autoriteit 44%

Je kunt een subset van een dataframe bewerken met loc:

df.loc[<row selection>, <column selection>]

In dit geval:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1

Antwoord 3, autoriteit 17%

w.female.replace(to_replace=dict(female=1, male=0), inplace=True)

Zie pandas.DataFrame.replace() docs.


Antwoord 4, autoriteit 14%

Kleine variatie:

w.female.replace(['male', 'female'], [1, 0], inplace=True)

Antwoord 5, autoriteit 7%

Dit zou ook moeten werken:

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0

Antwoord 6, autoriteit 4%

Je kunt ook applygebruiken met .getd.w.z.

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

Dataframe w:

  female
0  female
1    male
2  female

Gebruik applyom waarden uit het woordenboek te vervangen:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

Resultaat:

  female
0       1
1       0
2       1 

Opmerking:applymet woordenboek moet worden gebruikt als alle mogelijke waarden van de kolommen in het dataframe in het woordenboek zijn gedefinieerd, anders is het leeg voor degenen die niet gedefinieerd in woordenboek.


Antwoord 7, autoriteit 4%

Dit is erg compact:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

Nog een goede:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)

Antwoord 8, autoriteit 3%

Als alternatief is er de ingebouwde functie pd.get_dummies voor dit soort opdrachten:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

Dit geeft je een dataframe met twee kolommen, één voor elke waarde die voorkomt in w[‘female’], waarvan je de eerste laat vallen (omdat je deze kunt afleiden uit de overgebleven waarde). De nieuwe kolom wordt automatisch genoemd als de tekenreeks die u hebt vervangen.

Dit is vooral handig als je categorische variabelen hebt met meer dan twee mogelijke waarden. Deze functie creëert zoveel dummyvariabelen als nodig is om onderscheid te maken tussen alle gevallen. Pas dan op dat u niet het volledige dataframe aan een enkele kolom toewijst, maar in plaats daarvan, als w[‘female’] ‘mannelijk’, ‘vrouwelijk’ of ‘neutraal’ zou kunnen zijn, doe dan zoiets als dit:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

Dan heb je twee nieuwe kolommen die je de dummy-codering van ‘female’ geven en je hebt de kolom met de strings verwijderd.


Antwoord 9, autoriteit 2%

Series.mapgebruiken met Series.fillna

Als uw kolom meer tekenreeksen bevat dan alleen femaleen male, zal Series.mapin dit geval mislukken omdat het NaNvoor andere waarden.

Daarom moeten we het koppelen met fillna:

Voorbeeld waarom .mapmislukt:

df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})
   female
0    male
1  female
2  female
3    male
4   other
5   other
df['female'].map({'female': '1', 'male': '0'})
0      0
1      1
2      1
3      0
4    NaN
5    NaN
Name: female, dtype: object

Voor de juistemethode koppelen we mapaan fillna, dus vullen we de NaNmet waarden van de originele kolom:

df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])
0        0
1        1
2        1
3        0
4    other
5    other
Name: female, dtype: object

Antwoord 10

Er is ook een functie in pandasgenaamd factorizedie u kunt gebruiken om dit soort werk automatisch te doen. Het zet labels om in getallen: ['male', 'female', 'male'] -> [0, 1, 0]. Zie ditantwoord voor meer informatie.


Antwoord 11

w.replace({'female':{'female':1, 'male':0}}, inplace = True)

De bovenstaande code vervangt ‘female’ door 1 en ‘male’ door 0, alleen in de kolom ‘female’


Antwoord 12

w.female = np.where(w.female=='female', 1, 0)

als iemand op zoek is naar een numpy oplossing. Dit is handig om waarden te vervangen op basis van een voorwaarde. Zowel if- als else-voorwaarden zijn inherent aan np.where(). De oplossingen die df.replace()gebruiken, zijn mogelijk niet haalbaar als de kolom naast 'male'veel unieke waarden bevat, die allemaal moeten worden vervangen door 0.

Een andere oplossing is het gebruik van df.where()en df.mask()achter elkaar. Dit komt omdat geen van beide een else-voorwaarde implementeert.

w.female.where(w.female=='female', 0, inplace=True) # replace where condition is False
w.female.mask(w.female=='female', 1, inplace=True) # replace where condition is True

Antwoord 13

Ik denk dat als antwoord moet worden aangegeven welk type object je krijgt in alle hierboven voorgestelde methoden: is het Series of DataFrame.

Als je een kolom krijgt van w.female.of w[[2]](waarbij, stel dat 2 het nummer van je kolom is), krijg je terug DataFrame.
In dit geval kunt u dus DataFrame-methoden gebruiken, zoals .replace.

Als je .locof ilocgebruikt, krijg je Series terug, en Series hebben geen .replace-methode, dus je zou moeten gebruiken methoden zoals apply, mapenzovoort.


Antwoord 14

dic = {'female':1, 'male':0}
w['female'] = w['female'].replace(dic)

.replace heeft als argument een woordenboek waarin je mag veranderen en doen wat je wilt of nodig hebt.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

15 + 2 =

Other episodes