我想将我的自定义函数(它使用if-else梯子)应用于我的数据框架的每一行中的这六列(ERI_Hispanic
, ERI_AmerInd_AKNatv
, ERI_Asian
, ERI_Black_Afr.Amer
, ERI_HI_PacIsl
, ERI_White
)。
我已经尝试了其他问题中的不同方法,但似乎仍然无法找到适合我的问题的答案。 其中最关键的一点是,如果这个人被算作西班牙裔,他们就不能被算作其他什么人。 即使他们在另一个种族栏里有一个"1",他们仍然被算作西班牙裔,而不是两个或多个种族。 同样,如果所有ERI列的总和大于1,他们将被算作两个或多个种族,不能被算作唯一的种族(除了西班牙裔)。 希望这能说明问题。 如果有任何帮助,我们将不胜感激。
这几乎就像在每一行中做一个for循环,如果每条记录符合一个标准,它们就被添加到一个列表中,并从原来的列表中剔除。
从下面的数据框架中,我需要在SQL中基于以下规格计算一个新的列。
========================= 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标志为真(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
好的,这有两个步骤--首先是写一个函数,做你想要的翻译--我已经根据你的伪代码写了一个例子。
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'
你可能想复习一下,但它似乎可以做到这一点--注意,进入函数的参数被认为是一个标记为"行"的系列对象。
接下来,使用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
# a b
# 0 1 3
# 1 2 4
# create an unattached column with an index
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
# a b c
# 0 1 3 4
# 1 2 4 6
如果你得到SettingWithCopyWarning
,你也可以这样做。
fn = lambda row: row.a + row.b # define a function for the new column
col = df.apply(fn, axis=1) # get column data with an index
df = df.assign(c=col.values) # assign values to column 'c'
来源:https://stackoverflow.com/a/12555510/243392
而如果你的列名包括空格,你可以使用这样的语法。
df = df.assign(**{'some column name': col.values})
.apply()
接收一个函数作为第一个参数;像这样传入label_race
函数。
df['race_label'] = df.apply(label_race, axis=1)
你不需要做一个lambda函数来传入一个函数。