如何在pandas loc条件赋值中正确使用f-string插入逐行变量?
问题根源
你代码中赋值给name、topic的是包含整列数据的pandas Series对象。f-string是Python层面的单次字符串格式化工具,运行时只会把传入的Series整体转成字符串,不会触发pandas的逐行匹配逻辑,最终导致生成的评语单元格里塞入整列的所有姓名、学科值,而非对应单个学生的匹配信息。
正确实现方案
两种常用落地方案,可根据实际数据量选择:
- 逐行适配法(适合中小规模数据,逻辑直观易维护)
借助DataFrame.apply设置axis=1实现逐行遍历,每轮遍历将当前行的单行数据传入处理逻辑,此时取到的姓名、学科都是对应行的单值,可直接用f-string完成格式化,同时内嵌成绩阈值的判断规则:import pandas as pd report = pd.DataFrame({'Preferred Name': ['Jack', 'Jenny', 'Bob'], 'Topic': ['English', 'English', 'Maths'], 'HomeworkAv': [84.6, 68, 94.1]}) report['TopicSentence'] = report.apply( lambda row: f"{row['Preferred Name']} has consistently demonstrated an excellent understanding for {row['Topic']} throughout the entire term. " if row['HomeworkAv'] >= 80 else '', axis=1 ) - 向量化拼接法(适合大规模数据,运行性能更高)
先通过布尔索引筛选出满足成绩阈值的行,再利用pandas字符串列的逐元素拼接能力完成文本组装,全程无需逐行循环,在学生数据量较大时运行速度远高于逐行遍历方案:# 初始化评语列 report['TopicSentence'] = '' # 筛选达到优秀标准的行 qualified_rows = report['HomeworkAv'] >= 80 # 对筛选出的行逐元素拼接文本内容 report.loc[qualified_rows, 'TopicSentence'] = ( report.loc[qualified_rows, 'Preferred Name'] + " has consistently demonstrated an excellent understanding for " + report.loc[qualified_rows, 'Topic'] + " throughout the entire term. " )
注意:不要将整列的Series对象直接传入全局位置的f-string做格式化,这类操作只会在赋值瞬间一次性完成计算,无法响应pandas的逐行匹配规则。
内容的提问来源于stack exchange,提问作者Liam Graneri
相关产品推荐
相关产品推荐

