我想将我的自定义函数(它使用 if-else 阶梯)应用于我的数据框每一行中的这六列(ERI_Hispanic, ERI_AmerInd_AKNatv, ERI_Asian, ERI_Black_Afr.Amer, ERI_HI_PacIsl, ERI_White)。
ERI_Hispanic
ERI_AmerInd_AKNatv
ERI_Asian
ERI_Black_Afr.Amer
ERI_HI_PacIsl
ERI_White
我尝试了与其他问题不同的方法,但似乎仍然无法为我的问题找到正确的答案。这其中的关键部分是,如果这个人被算作西班牙裔,他们就不能算作其他任何人。即使他们在另一个种族列中有“1”,他们仍然被视为西班牙裔,而不是两个或更多种族。同样,如果所有 ERI 列的总和大于 1,则它们被计为两个或多个种族,不能算作一个独特的种族(西班牙裔除外)。希望这是有道理的。任何帮助将不胜感激。
它几乎就像对每一行进行 for 循环,如果每条记录符合标准,它们将被添加到一个列表中并从原始列表中删除。
从下面的数据框中,我需要根据 SQL 中的以下规范计算一个新列:
========================= 标准 ======================== =======
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”
评论:如果西班牙裔的 ERI 标志为真 (1),则该员工被归类为“西班牙裔”
评论:如果超过 1 个非西班牙裔 ERI 标志为真,则返回“两个或更多”
====================== 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
好的,有两个步骤 - 首先是编写一个执行您想要的翻译的函数 - 我根据您的伪代码将一个示例放在一起:
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'
您可能想了解这一点,但它似乎可以解决问题 - 请注意,进入函数的参数被认为是一个标有“行”的 Series 对象。
接下来,使用 pandas 中的 apply 函数来应用该函数 - 例如
df.apply (lambda row: label_race(row), axis=1)
请注意 axis=1 说明符,这意味着应用程序是在行级别上完成的,而不是在列级别上完成的。结果在这里:
0 White 1 Hispanic 2 White 3 White 4 Other 5 White 6 Two Or More 7 White 8 Haw/Pac Isl. 9 White
如果您对这些结果感到满意,请再次运行它,将结果保存到原始数据框中的新列中。
df['race_label'] = df.apply (lambda row: label_race(row), axis=1)
生成的数据框如下所示(向右滚动以查看新列):
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