pandas crea una nuova colonna basata sui valori di altre colonne / applica una funzione di più colonne, in base alle righe
Voglio applicare la mia funzione personalizzata (usa una scala if-else) a queste sei colonne (ERI_Hispanic
, ERI_AmerInd_AKNatv
, ERI_Asian
, ERI_Black_Afr.Amer
, ERI_HI_PacIsl
, ERI_White
) in ogni riga del mio dataframe.
Ho provato diversi metodi da altre domande ma ancora non riesco a trovare la risposta giusta per il mio problema. La parte critica di questo è che se la persona è contata come ispanica non può essere contata come qualsiasi altra cosa. Anche se hanno un "1" in un'altra colonna di etnia sono ancora contati come ispanici e non come due o più razze. Allo stesso modo, se la somma di tutte le colonne ERI è maggiore di 1 sono contati come due o più razze e non possono essere contati come un'unica etnia (eccetto ispanici). Speriamo che questo abbia senso. Qualsiasi aiuto sarà molto apprezzato.
È quasi come fare un ciclo for attraverso ogni riga e se ogni record soddisfa un criterio viene aggiunto a una lista ed eliminato dall'originale.
Dal dataframe sottostante ho bisogno di calcolare una nuova colonna basata sulla seguente specifica in SQL:
========================= CRITERIA ===============================
IF [ERI_Hispanic] = 1 THEN RETURN “Hispanic”
ELSE IF SUM([ERI_AmerInd_AKNatv] + [ERI_Asian] + [ERI_Black_Afr.Amer] + [ERI_HI_PacIsl] + [ERI_White]) > 1 THEN RETURN “Two or More”
ELSE IF [ERI_AmerInd_AKNatv] = 1 THEN RETURN “A/I AK Native”
ELSE IF [ERI_Asian] = 1 THEN RETURN “Asian”
ELSE IF [ERI_Black_Afr.Amer] = 1 THEN RETURN “Black/AA”
ELSE IF [ERI_HI_PacIsl] = 1 THEN RETURN “Haw/Pac Isl.”
ELSE IF [ERI_White] = 1 THEN RETURN “White”
Commento: Se il flag ERI per l'ispanico è vero (1), il dipendente è classificato come "ispanico".
Commento: Se più di 1 flag ERI non ispanico è vero, restituire "Due o più"
====================== DATAFRAME ===========================
lname fname rno_cd eri_afr_amer eri_asian eri_hawaiian eri_hispanic eri_nat_amer eri_white rno_defined
0 MOST JEFF E 0 0 0 0 0 1 White
1 CRUISE TOM E 0 0 0 1 0 0 White
2 DEPP JOHNNY 0 0 0 0 0 1 Unknown
3 DICAP LEO 0 0 0 0 0 1 Unknown
4 BRANDO MARLON E 0 0 0 0 0 0 White
5 HANKS TOM 0 0 0 0 0 1 Unknown
6 DENIRO ROBERT E 0 1 0 0 0 1 White
7 PACINO AL E 0 0 0 0 0 1 White
8 WILLIAMS ROBIN E 0 0 1 0 0 0 White
9 EASTWOOD CLINT E 0 0 0 0 0 1 White
OK, due passi per questo - il primo è scrivere una funzione che faccia la traduzione che vuoi - ho messo insieme un esempio basato sul tuo pseudo-codice:
Potresti voler rivedere questo, ma sembra fare il trucco - nota che il parametro che va nella funzione è considerato un oggetto Serie etichettato "row".
Successivamente, usate la funzione apply in pandas per applicare la funzione - ad esempio
Notate lo specificatore axis=1, che significa che l'applicazione viene fatta a livello di riga, piuttosto che di colonna. I risultati sono qui:
Se siete soddisfatti di questi risultati, eseguitelo di nuovo, salvando i risultati in una nuova colonna del vostro dataframe originale.
Il dataframe risultante assomiglia a questo (scorri a destra per vedere la nuova colonna):
Poiché questo è il primo risultato di Google per 'pandas new column from others', ecco un semplice esempio:
Se ottenete il
SettingWithCopyWarning
potete farlo anche in questo modo:Fonte: https://stackoverflow.com/a/12555510/243392
E se il vostro nome di colonna include spazi potete usare una sintassi come questa:
Ed ecco la documentazione per apply, e assign.
.apply()
prende una funzione come primo parametro; passate la funzionelabel_race
come tale:Non c'è bisogno di fare una funzione lambda per passare una funzione.