![](/img/trans.png)
[英]Pandas: Add new column and assigning value from another dataframe by condition
[英]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.