我有一个熊猫数据框df,例如:
name | grade | grade_type
---------------------------
sarah | B | letter
alice | A | letter
eliza | C | letter
beth | 76 | numeral
jones | 90 | numeral
中的所有值df
都是字符串,包括数字。我想grade
根据检查grade_type
列将数值转换为字母,以获得:
name | grade | grade_type
---------------------------
sarah | B | letter
alice | A | letter
eliza | C | letter
beth | B | numeral
jones | A | numeral
为了完整起见,数字到字母的等级转换是:
A: grade > 80
B: 70 < grade <= 80
C: 60 < grade <= 70
为什么不起作用?
for index, row in df.iterrows():
if row.grade_type == "numeral":
grade_val = int(row.grade.values[0])
if grade_val > 80:
row.grade = "A" # This assignment doesn't update row.grade!
elif...
替代方法是使用df.apply(...lambda:...)
,但我不太确定如何实现该目标,因为我们必须grade_type
在确定是否更新该grade
值之前先检查该列。
DataFrame不更新的原因是因为iterrows()返回的行是副本。您正在处理该副本。
您可以使用index
返回从iterrows和直接操作数据框:
for index, row in df.iterrows():
grade_val = int(row.grade.values[0])
if grade_val > 80:
df.loc[index, 'grade'] = 'A'
...
或者如您所说,您可以使用df.apply(),并将自定义函数传递给它:
def get_grades(x):
if x['grade_type'] == 'letter':
return(x['grade_val'])
if x['grade_val'] > 80:
return "A"
...
df['grade'] = df.apply(lambda x: get_grades(x), axis=1)
您还可以if
else
在lambda中使用以下方法检查x['grade_type']
数字是否为数字,使用看起来更容易阅读的数字。
def get_grades(grade_val):
if grade_val > 80:
return "A"
...
df['grade'] = df.apply(lambda x: get_grades(x['grade'])
if x['grade_type'] == 'numeral' else x['grade'], axis=1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句