Python 熊猫-如何将非数值更新为数值并求和?熊猫
我有这样一个DF: 大学生 年龄 分数 乔 23 A、B、C 做记号 22 B、B、C 伊恩 24 A B APython 熊猫-如何将非数值更新为数值并求和?熊猫,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个DF: 大学生 年龄 分数 乔 23 A、B、C 做记号 22 B、B、C 伊恩 24 A B A 您可以创建一个等级到编号的地图字典。然后按空格拆分等级列,并使用映射和字典(列表(映射(lambda x:grade_num[x],x))将每个等级转换为数字,并对获得的值求和 grade_num = {'A': 1, 'B': 2, 'C': 3} df['Sum'] = (df['Grades'].str.split(' ') .apply(lambda
您可以创建一个等级到编号的地图字典。然后按空格拆分
等级
列,并使用映射
和字典(列表(映射(lambda x:grade_num[x],x))
将每个等级转换为数字,并对获得的值求和
grade_num = {'A': 1, 'B': 2, 'C': 3}
df['Sum'] = (df['Grades'].str.split(' ')
.apply(lambda x: np.sum(list(map(lambda x: grade_num[x], x)))))
df
Student Age Grades Sum
0 Joe 23 A B C 6
1 Mark 22 B B C 7
2 Ian 24 A B A 4
您可以创建一个等级到编号的地图字典。然后按空格拆分
等级
列,并使用映射
和字典(列表(映射(lambda x:grade_num[x],x))
将每个等级转换为数字,并对获得的值求和
grade_num = {'A': 1, 'B': 2, 'C': 3}
df['Sum'] = (df['Grades'].str.split(' ')
.apply(lambda x: np.sum(list(map(lambda x: grade_num[x], x)))))
df
Student Age Grades Sum
0 Joe 23 A B C 6
1 Mark 22 B B C 7
2 Ian 24 A B A 4
您可以定义一个函数,在该函数中,将非数值坡度映射为数值坡度
def grades_to_num(grades):
grades_dict = {"A":1, "B":2, "C":3}
numgrades = [grades_dict[grade] for grade in grades.split()]
return sum(numgrades)
然后,您可以将该函数应用于df,以使用数字和创建一个新列
df["Sum"] = df["Grades"].apply(grades_to_num)
您可以定义一个函数,在该函数中,将非数值坡度映射为数值坡度
def grades_to_num(grades):
grades_dict = {"A":1, "B":2, "C":3}
numgrades = [grades_dict[grade] for grade in grades.split()]
return sum(numgrades)
然后,您可以将该函数应用于df,以使用数字和创建一个新列
df["Sum"] = df["Grades"].apply(grades_to_num)
我添加了一个示例,其中我创建了一个dataframe(没有列名),并通过创建dataframe的副本并引入一个新列(3)作为总和来更新值。代码示例仅使用pandas编写
import pandas as pd
grades = {'A': 1, 'B': 2, 'C': 3}
df = pd.DataFrame([['Joe', 23, 'A B C'], ['Mark', 22, 'B B C']])
new_df = df.copy()
new_df[3] = 0
for i, r in new_df.iterrows():
grade_list = r[2].split(" ")
s = 0
for g in grade_list:
s += grades[g]
new_df.loc[i, 3] = s
我添加了一个示例,其中我创建了一个dataframe(没有列名),并通过创建dataframe的副本并引入一个新列(3)作为总和来更新值。代码示例仅使用pandas编写
import pandas as pd
grades = {'A': 1, 'B': 2, 'C': 3}
df = pd.DataFrame([['Joe', 23, 'A B C'], ['Mark', 22, 'B B C']])
new_df = df.copy()
new_df[3] = 0
for i, r in new_df.iterrows():
grade_list = r[2].split(" ")
s = 0
for g in grade_list:
s += grades[g]
new_df.loc[i, 3] = s
谢谢,米切尔,太好了。快速高效,我喜欢该功能,因此在需要类似操作时可以再次使用。您可以使用map并替换数据框中的A、B、C值,然后仅使用数字。谢谢,Mitchel,太好了。快速高效,我喜欢该功能,因此在需要类似操作时可以再次使用。您可以使用map并替换数据框中的A、B、C值,然后仅使用数字。谢谢@ggaurav,我使用了其他解决方案,但您的解决方案非常类似。还不错,效率也很高。谢谢@ggaurav,我选择了另一种解决方案,但您的解决方案非常相似。还不错,效率高。