python - Pandas 根据其他列的值创建新列/逐行应用多列的函数

标签 python pandas dataframe numpy apply

我想将我的自定义函数(它使用 if-else 阶梯)应用到这六列(ERI_HispanicERI_AmerInd_AKNatvERI_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 标志为真,则返回“两个或更多”

数据框

     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'

您可能想了解这一点,但它似乎可以解决问题 - 请注意,进入函数的参数被认为是标记为“行”的 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

关于python - Pandas 根据其他列的值创建新列/逐行应用多列的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26886653/

相关文章:

python - python 中的合并排序实现给出不正确的结果

Python、PowerShell 还是其他?

python - 在python中将Dataframe列转换为时间格式

python - 在 Pandas 中 reshape 数据框

python - 类型错误 : '<=' not supported between instances of 'str' and 'int' Duplicate

python - 反转 DataFrame 中的单个列

python - 创建从字符串命名的类对象实例?

python - 不规则嵌套 np.where 子句的替代方案

python - 收集通过随机采样其他数据帧构建的数据帧的汇总统计信息

scala - 如何从 Spark Dataframe 的列中的 Vector 中提取值