Svojo funkcijo po meri (uporablja lestev if-else) želim uporabiti za teh šest stolpcev (ERI_Hispanic
, ERI_AmerInd_AKNatv
, ERI_Asian
, ERI_Black_Afr.Amer
, ERI_HI_PacIsl
, ERI_White
) v vsaki vrstici svojega podatkovnega okvira.
Poskusil sem različne metode iz drugih vprašanj, vendar še vedno ne morem najti pravega odgovora za svoj problem. Ključni del tega je, da če je oseba šteta kot Hispanec, ne more biti šteta kot karkoli drugega. Tudi če ima v drugem stolpcu za etnično pripadnost "1", se še vedno šteje kot Hispanec, ne pa kot pripadnik dveh ali več ras. Podobno, če je vsota vseh stolpcev ERI večja od 1, se štejejo kot dve ali več ras in se ne morejo šteti kot posebna etnična pripadnost (razen Hispancev). Upam, da je to smiselno. Za vsako pomoč bom zelo hvaležen.
Skoraj tako, kot da bi naredil zanko for skozi vsako vrstico in če vsak zapis izpolnjuje merilo, se doda na en seznam in izloči iz prvotnega.
Iz spodnjega podatkovnega okvira moram izračunati nov stolpec na podlagi naslednje specifikacije v jeziku 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”
Komentar: Če je zastavica ERI za Hispanic True (1), je zaposleni razvrščen kot "Hispanic".
Komentar: Če je resnična več kot ena oznaka ERI za neispansko narodnost, vrnite "Dva ali več".
====================== 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
V redu, dva koraka za to - prvi je, da napišete funkcijo, ki naredi prevod, ki ga želite - pripravil sem primer, ki temelji na vaši psevdo-kodi:
def label_race (row):
if row['eri_hispanic'] == 1 :
return 'Hispanic'
if row['eri_afr_amer'] + row['eri_asian'] + row['eri_hawaiian'] + row['eri_nat_amer'] + row['eri_white'] > 1 :
return 'Two Or More'
if row['eri_nat_amer'] == 1 :
return 'A/I AK Native'
if row['eri_asian'] == 1:
return 'Asian'
if row['eri_afr_amer'] == 1:
return 'Black/AA'
if row['eri_hawaiian'] == 1:
return 'Haw/Pac Isl.'
if row['eri_white'] == 1:
return 'White'
return 'Other'
Morda ga boste želeli še enkrat pregledati, vendar se zdi, da bo to zadostovalo - opazite, da se parameter, ki vstopa v funkcijo, obravnava kot objekt serije z oznako "vrstica".
Nato uporabite funkcijo apply v programu pandas, da uporabite funkcijo - npr.
df.apply (lambda row: label_race(row), axis=1)
Upoštevajte označevalnik axis=1, ki pomeni, da je uporaba izvedena na ravni vrstic in ne stolpcev. Rezultati so tukaj:
0 White
1 Hispanic
2 White
3 White
4 Other
5 White
6 Two Or More
7 White
8 Haw/Pac Isl.
9 White
Če ste s temi rezultati zadovoljni, jo zaženite še enkrat in rezultate shranite v nov stolpec v prvotnem podatkovnem okviru.
df['race_label'] = df.apply (lambda row: label_race(row), axis=1)
Tako dobljeni podatkovni okvir je videti takole (za ogled novega stolpca se pomaknite na desno):
lname fname rno_cd eri_afr_amer eri_asian eri_hawaiian eri_hispanic eri_nat_amer eri_white rno_defined race_label
0 MOST JEFF E 0 0 0 0 0 1 White White
1 CRUISE TOM E 0 0 0 1 0 0 White Hispanic
2 DEPP JOHNNY NaN 0 0 0 0 0 1 Unknown White
3 DICAP LEO NaN 0 0 0 0 0 1 Unknown White
4 BRANDO MARLON E 0 0 0 0 0 0 White Other
5 HANKS TOM NaN 0 0 0 0 0 1 Unknown White
6 DENIRO ROBERT E 0 1 0 0 0 1 White Two Or More
7 PACINO AL E 0 0 0 0 0 1 White White
8 WILLIAMS ROBIN E 0 0 1 0 0 0 White Haw/Pac Isl.
9 EASTWOOD CLINT E 0 0 0 0 0 1 White White
Ker je to prvi rezultat v Googlu za 'pandas new column from others', je tu preprost primer:
import pandas as pd
# make a simple dataframe
df = pd.DataFrame({'a':[1,2], 'b':[3,4]})
df
# a b
# 0 1 3
# 1 2 4
# create an unattached column with an index
df.apply(lambda row: row.a + row.b, axis=1)
# 0 4
# 1 6
# do same but attach it to the dataframe
df['c'] = df.apply(lambda row: row.a + row.b, axis=1)
df
# a b c
# 0 1 3 4
# 1 2 4 6
Če dobite opozorilo SettingWithCopyWarning
, lahko to storite tudi na ta način:
fn = lambda row: row.a + row.b # define a function for the new column
col = df.apply(fn, axis=1) # get column data with an index
df = df.assign(c=col.values) # assign values to column 'c'
Vir: https://stackoverflow.com/a/12555510/243392
Če ime stolpca vsebuje presledke, lahko uporabite naslednjo sintakso:
df = df.assign(**{'some column name': col.values})
.apply()
sprejme funkcijo kot prvi parameter; tako posreduje funkcijo label_race
:
df['race_label'] = df.apply(label_race, axis=1)
Za posredovanje funkcije vam ni treba ustvariti funkcije lambda.