pandas根据其他列的值创build新的列

我已经尝试了其他问题的不同方法,但似乎无法find正确的答案,我的问题。 这个关键的一点是,如果这个人被认为是西class牙裔,那他们就不能算作别的。 即使他们在另一个种族列中有“1”,他们仍然被认为是西class牙裔,而不是两个或两个以上的种族。 同样,如果所有ERI列的总和大于1,则它们被计为两个或更多个种族,不能被视为一个独特的种族(接受西class牙裔)。 希望这是有道理的。 任何帮助将不胜感激。

它几乎就像在每一行做一个for循环,如果每条logging符合一个标准,它们将被添加到一个列表中并从原始列表中删除。

从下面的数据框我需要计算一个新的列基于以下内容:

========================= 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” 

评论:如果西class牙裔ERI标志为真(1),那么员工被归类为“西class牙裔”

评论:如果超过1个非西class牙裔ERI标记为真,则返回“两个或更多”

====================== DATAFRAME ===========================

在[13]:df1

出[13]:

  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 

好吧,这两个步骤 – 首先是编写一个函数,做你想要的翻译 – 我已经把你的伪代码放在一起:

 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' 

你可能想要重来一遍,但它似乎是做了一个小把戏 – 注意进入函数的参数被认为是一个标记为“row”的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 

由于这是Google第一个“pandas新专栏”的结果,下面是一个简单的例子:

 import pandas as pd # make a simple dataframe df = pd.DataFrame({'a':[1,2], 'b':[3,4]}) df # ab # 0 1 3 # 1 2 4 # this just creates an unattached column: 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 # abc # 0 1 3 4 # 1 2 4 6 

.apply()将函数作为第一个参数; 像这样传递label_race函数:

df['race_label'] = df.apply(label_race, axis=1)

你不需要做一个lambda函数来传入一个函数。