繁体   English   中英

将新列添加到 Pandas dataframe,其值来自 function

[英]Add a new column to a Pandas dataframe with a value from a function

我知道这与其他问题类似,但我找不到可以解决的问题。

我有一个 dataframe,其中包含看起来与此类似的成绩:

  subj1 subj2 subj3 subj4
0   A     B     A     B
1   B     B     C     B
2   C     C     B     A

我想要 append 新列中的 GPA 分数,这样结果是这样的:

  subj1 subj2 subj3 subj4 GPA
0   A     B     A     B   3.5
1   B     B     C     B   2.8
2   C     D     B     A   2.5

我用来计算 GPA 的 function 是这样的:

def calcgpa():
    for row in df.itertuples(index=False):
        tot = 0
        c = 0
        GPA = 0
        for i in range(len(row)):
            if row[i] == "A":
                tot = tot + 4
                c += 1
            elif row[i] == "B":
                tot = tot + 3
                c += 1
            elif row[i] == "C":
                tot = tot + 2
                c += 1
            elif row[i] == "D":
                tot = tot + 1
                c += 1
            else:
                c += 1
        GPA = tot / c
        return GPA

我认为df["GPA"] = pd.Series(calcgpa())会起作用,但它只会向第一行添加一个值。 所有其他的都是 NaN。 尝试使用 pd.apply 或 pd.assign 只是给了我一个 AssertionError。

问题是 function 如何返回 GPA 还是我需要添加新列的正确语法是什么?

假设您只有 AE,如果您还有其他任何东西,请确保先将它们替换为零,然后您可以执行以下操作:

df['GPA'] = df.replace({'A':4,'B':3,'C':2, 'D':1, 'E':0}).mean(1)

df 
  subj1 subj2 subj3 subj4   GPA
0     A     B     A     B  3.50
1     B     B     C     B  2.75
2     C     C     B     A  2.75

如果您查看calcgpa()的 output,它是一个浮点数: 3.5而不是 GPA 列表,因此您的 output 只给出 1 个值,然后是 Nans。

我建议您的代码需要将每个 GPA 值存储到一个列表中,并将其分配为列。 这需要对您的代码进行一些小的更改:

GPA = 0替换为GPA = []以将其转换为列表并将其移动到 function 的顶部,在两个 for 循环之外。 然后将GPA = tot/c更改为GPA.append(tot / c) to append 每个 GPA 到要分配为新 GPA 列的列表。

完整代码:

def calcgpa():
    GPA = []
    for row in df.itertuples(index=False):
        tot = 0
        c = 0
        for i in range(len(row)):
            if row[i] == "A":
                tot = tot + 4
                c += 1
            elif row[i] == "B":
                tot = tot + 3
                c += 1
            elif row[i] == "C":
                tot = tot + 2
                c += 1
            elif row[i] == "D":
                tot = tot + 1
                c += 1
            else:
                c += 1
        GPA.append(tot / c)
    return GPA

然后,您可以像这样将其分配给 GPA 列:

df["GPA"] = calcgpa()

Output:

  subj1 subj2 subj3 subj4   GPA
0     A     B     A     B  3.50
1     B     B     C     B  2.75
2     C     C     B     A  2.75

正如在另一个答案中发布的那样,有更有效的方法可以实现这一点,但由于您的代码很接近,我想我会修改它以实现结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM