Veri çerçevemin her satırındaki bu altı sütuna (ERI_Hispanic
, ERI_AmerInd_AKNatv
, ERI_Asian
, ERI_Black_Afr.Amer
, ERI_HI_PacIsl
, ERI_White
) özel işlevimi (if-else merdiveni kullanır) uygulamak istiyorum.
Diğer sorulardaki farklı yöntemleri denedim ama yine de sorunum için doğru cevabı bulamadım. Bunun kritik parçası, eğer kişi İspanyol olarak sayılırsa, başka bir şey olarak sayılamayacağıdır. Başka bir etnik köken sütununda "1" olsa bile yine de iki veya daha fazla ırktan değil Hispanik olarak sayılırlar. Benzer şekilde, tüm ERI sütunlarının toplamı 1'den büyükse, iki veya daha fazla ırk olarak sayılırlar ve benzersiz bir etnik köken olarak sayılamazlar (Hispanik hariç). Umarım bu mantıklıdır. Herhangi bir yardım çok takdir edilecektir.
Neredeyse her satırda bir for döngüsü yapmak gibi ve her kayıt bir kriteri karşılıyorsa, bir listeye eklenir ve orijinalden elenir.
Aşağıdaki veri çerçevesinden SQL'de aşağıdaki özelliğe göre yeni bir sütun hesaplamam gerekiyor:
========================= 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”
Yorum yap: Hispanik için ERI Bayrağı Doğru (1) ise, çalışan "Hispanik" olarak sınıflandırılır
Yorum yap: 1'den fazla Hispanik olmayan ERI Bayrağı doğruysa, "İki veya Daha Fazla" döndürün
====================== 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
Tamam, bunun için iki adım var - birincisi, istediğiniz çeviriyi yapan bir fonksiyon yazmak - sözde kodunuza dayanarak bir örnek oluşturdum:
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'
Bunun üzerinden geçmek isteyebilirsiniz, ancak işinizi görecek gibi görünüyor - işleve giren parametrenin "row" etiketli bir Seri nesnesi olarak kabul edildiğine dikkat edin.
Ardından, işlevi uygulamak için pandas'taki apply işlevini kullanın - örn.
df.apply (lambda row: label_race(row), axis=1)
Eksen=1 belirtecine dikkat edin; bu, uygulamanın sütun düzeyinde değil satır düzeyinde yapıldığı anlamına gelir. Sonuçlar burada:
0 White
1 Hispanic
2 White
3 White
4 Other
5 White
6 Two Or More
7 White
8 Haw/Pac Isl.
9 White
Bu sonuçlardan memnunsanız, sonuçları orijinal veri çerçevenizdeki yeni bir sütuna kaydederek tekrar çalıştırın.
df['race_label'] = df.apply (lambda row: label_race(row), axis=1)
Sonuçta ortaya çıkan veri çerçevesi aşağıdaki gibi görünür (yeni sütunu görmek için sağa kaydırın):
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
Bu, 'pandas new column from others' için ilk Google sonucu olduğundan, işte basit bir örnek:
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ğer SettingWithCopyWarning
uyarısı alırsanız, bunu bu şekilde de yapabilirsiniz:
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'
Kaynak: https://stackoverflow.com/a/12555510/243392
Sütun adınız boşluk içeriyorsa aşağıdaki gibi bir sözdizimi kullanabilirsiniz:
df = df.assign(**{'some column name': col.values})
.apply()ilk parametre olarak bir fonksiyon alır;
label_race` fonksiyonunu bu şekilde iletin:
df['race_label'] = df.apply(label_race, axis=1)
Bir işlevi geçirmek için bir lambda işlevi oluşturmanıza gerek yoktur.