当前位置: 首页 > 面试题库 >

Python-pandas根据其他列的值创建新列/逐行应用多列的功能

陈铭晨
2023-03-14
问题内容

我想申请我的自定义函数(它使用的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标志为True(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           

问题答案:

好的,执行此步骤有两个步骤-首先是编写一个可以执行所需翻译的函数-我已根据你的伪代码将一个示例放在一起:

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对象。

接下来,在熊猫中使用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



 类似资料:
  • 我想将我的自定义函数(它使用if-else梯形)应用到数据帧每行中的这六列(,,,,,)。 我已经尝试了不同的方法从其他问题,但似乎仍然不能找到正确的答案,我的问题。关键的一点是,如果这个人被算作西班牙裔,他们就不能算作其他任何东西。即使他们在另一个种族栏中有一个“1”,他们仍然被算作西班牙裔,而不是两个或两个以上的种族。类似地,如果所有ERI列的总和大于1,则被计为两个或两个以上的种族,不能被计

  • 我想在Pandas数据集中创建一个新列,基于另外两个列的值。 现在,应该如下所示: 有什么帮助吗?

  • 问题内容: 我想比较在创建新列的两列的值。如果它们等于1,我想要1,否则等于0。 我得到了以下错误 问题答案: 您需要将布尔型蒙版转换为: 样品: 因为比较列的输出不是标量,而是(和)和值,所以会出现错误。 因此需要或 用于返回标量或。

  • 假设我有一个名为mytable的表,它看起来像这样: 我希望能够更新所有的记录在p6列添加到39但只为行有不同的p2值。换句话说,结果表应该如下所示: 我将p6行着色为黄色,以显示它不应该移动的地方,因为所有的p2单元格都是灰色的,它们的值是相同的。绿色的p6行应该会增长,因为p2也会增长,所以我把+39加到所有的行上。示例中的最后第13行再次为黄色,因为12行上的p2=13行上的p2。 在Gor

  • 我有一个数据集,其中有大量表示过程代码的字符串列变量。还有另一列变量表示编码格式(有些是ICD9,有些是其他更神秘的格式)。每次观察都是一个病人。我需要: 搜索每个带有特定前缀的变量名 确保正在使用的代码是ICD9代码(由“02”表示)。 查找这些代码中哪些与特定字符串的前3个字符匹配 如果有任何变量以这三个字符开头,则创建一个新列变量=1,如果没有匹配,则创建一个新列变量=0 变量太多了,通过c

  • 问题内容: 我有以下DataFrame: 我需要删除等于的行0。最有效的方法是什么? 问题答案: 如果我正确理解的话,它应该很简单: