如何从DataFrame同一行获取多值以创建宝可梦对象
优化方案
1. 提取整行数据减少重复调用
先一次性获取目标行的所有数据,再从中提取字段,避免重复调用sets.loc[setindex, ...],代码更简洁:
sets = pd.read_excel("SetsSheet.xlsx", index_col=0, header=0) def fromset(setindex): row = sets.loc[setindex] # 假设行索引就是宝可梦名称,对应BattlePokemon的name参数 name = row.name type1 = row["type 1"] type2 = row["type 2"] hp = row["hp"] # 批量提取所有move列生成learnset,后续新增move列也无需修改代码 learnset = row.filter(like="move").tolist() return BattlePokemon(name, type1, type2, hp, learnset)
2. 用字典解包简化参数传递
如果能让BattlePokemon的参数名和DataFrame列名对齐(比如重命名列),可以直接把行数据转成字典后解包,大幅减少手动赋值代码:
sets = pd.read_excel("SetsSheet.xlsx", index_col=0, header=0) # 重命名列名,和类参数名匹配 sets = sets.rename(columns={ "type 1": "type1", "type 2": "type2", "move 1": "move1", "move 2": "move2" }) def fromset(setindex): row_dict = sets.loc[setindex].to_dict() name = row_dict.pop("name") if "name" in row_dict else row.name learnset = [row_dict.pop("move1"), row_dict.pop("move2")] # 用**解包剩余参数 return BattlePokemon(name, learnset=learnset, **row_dict)
3. 额外优化:处理空值场景
如果部分宝可梦没有第二属性或多余技能,可以在提取时设置默认值,避免空值报错:
def fromset(setindex): row = sets.loc[setindex] name = row.name type1 = row["type 1"] type2 = row.get("type 2", None) # 无第二属性时返回None hp = row["hp"] # 过滤空值,只保留有效技能 learnset = [move for move in row.filter(like="move").tolist() if pd.notna(move)] return BattlePokemon(name, type1, type2, hp, learnset)
内容的提问来源于stack exchange,提问作者Zoe Allen
相关产品推荐
相关产品推荐

