我想将我的自定义函数(它使用if else梯形图)应用到数据帧的每一行中的这六列(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 0 1 White
上面的答案是完全有效的,但是存在向量化的解决方案,形式是
numpy.select
。这允许您定义条件,然后为这些条件定义输出,比使用apply
更有效:首先,定义条件:
现在,定义相应的输出:
最后,使用
numpy.select
:为什么要在
apply
上使用numpy.select
?以下是一些性能检查:使用
numpy.select
可以大大提高性能,而且这种差异只会随着数据的增长而增加。好的,有两个步骤-首先是编写一个函数来完成您想要的转换-我根据您的伪代码将一个示例放在一起:
您可能想了解一下这一点,但它似乎起到了关键作用—请注意,进入函数的参数被认为是一个标记为“row”的序列对象。
接下来,在pandas中使用apply函数来应用该函数-例如
注意axis=1说明符,这意味着应用程序是在行级别而不是列级别完成的。结果如下:
如果您对这些结果满意,请再次运行它,将结果保存到原始数据帧中的新列中。
结果数据框如下所示(向右滚动以查看新列):
由于这是“其他人的熊猫新专栏”的第一个Google结果,下面是一个简单的例子:
如果你得到了
SettingWithCopyWarning
,你也可以这样做:来源:https://stackoverflow.com/a/12555510/243392
如果列名包含空格,则可以使用以下语法:
这是apply和assign的文档。
相关问题 更多 >
编程相关推荐