我尝试了其他问题的不同方法,但似乎仍然找不到我的问题的正确答案 . 关键的一点是,如果这个人被算作西班牙裔,他们就不能算作别的了 . 即使他们在另一个种族栏目中有“1”,他们仍被视为西班牙裔,而不是两个或更多种族 . 同样,如果所有ERI列的总和大于1,则它们被计为两个或更多种族,不能算作独特的种族(接受西班牙裔) . 希望这是有道理的 . 任何帮助将不胜感激 .
它几乎就像在每行中执行for循环一样,如果每条记录符合条件,它们将被添加到一个列表中并从原始列表中删除 .
从下面的数据框中,我需要根据以下内容计算新列:
========================= 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”
评论:如果西班牙裔美国人的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 0 1 White
4 回答
好的,这两个步骤 - 首先是编写一个执行你想要的翻译的函数 - 我根据你的伪代码将一个例子放在一起:
你可能想要讨论这个问题,但它似乎可以解决这个问题 - 注意进入函数的参数被认为是一个标记为“row”的Series对象 .
接下来,使用pandas中的apply函数来应用函数 - 例如
注意axis = 1说明符,这意味着应用程序是在一行而不是列级别完成的 . 结果如下:
如果您对这些结果感到满意,请再次运行,将结果发布到原始数据框中的新列中 .
结果数据框看起来像这样(向右滚动以查看新列):
.apply()
接受函数作为第一个参数;传递label_race
函数如下:您不需要使用lambda函数来传递函数 .
由于这是“其他人的pandas新专栏”的第一个Google结果,这里有一个简单的例子:
如果你得到了
SettingWithCopyWarning
,你也可以这样做:资料来源:https://stackoverflow.com/a/12555510/243392
如果您的列名称包含空格,您可以使用如下语法:
这是apply和assign的文档 .
上面的答案是完全有效的,但是以
numpy.select
的形式存在矢量化解决方案 . 这允许您定义条件,然后为这些条件定义输出,比使用apply
更有效:首先,定义条件:
现在,定义相应的输出:
最后,使用
numpy.select
:numpy.select
为什么要在apply
上使用?以下是一些性能检查:使用
numpy.select
可以大大提高性能,并且差异只会随着数据的增长而增加 .