基于DataFrame生成Gene实例后,初始化Chromosome类遇参数错误求助
解决Chromosome初始化的TypeError问题
你碰到的这个错误逻辑很清晰:TypeError: __init__() takes 1 positional argument but 2 were given,根源在于你的Chromosome类构造函数只定义了self这一个必传参数,但你初始化的时候却传了tester作为第二个参数,Python自然不知道该怎么处理这个额外的输入。
下面是一步步的修复方案:
1. 修改Chromosome类的构造函数
让它能够接收一个包含Gene对象的列表,这样就能把你从DataFrame生成的Gene实例传入了。同时注意你原来的Chromosome初始化代码里[Gene() for id in range(20)]本身也会报错——因为你的Gene类需要3个参数才能实例化,这里也得一并处理:
class Chromosome(object): def __init__(self, gene_list): # 根据你的需求处理gene_list的长度: # 示例1:取前20个Gene对象(如果列表长度超过20) self.port = gene_list[:20] # 示例2:如果列表不足20个,用默认Gene填充(需要先给Gene加默认参数,看下一步) # while len(self.port) < 20: # self.port.append(Gene())
2. 给Gene类添加默认参数(可选但实用)
为了避免在需要创建默认Gene实例时报错,给Gene的构造函数加上默认参数:
class Gene: def __init__(self, id="default_id", nb_trax=0, nb_days=0): self.id = id self.nb_trax = nb_trax self.nb_days = nb_days
3. 修正Gene实例生成的代码
注意你原来的apply里用的列名和DataFrame实际列名不匹配(你的DataFrame列是ID, nb_obj, nb_days,但代码里写的是Injection Port和Avg Daily Injection),而且df.apply返回的是Series,需要转成列表才能传入Chromosome:
import random import pandas as pd # 假设df是你的目标DataFrame tester = df.apply(lambda row: Gene(row['ID'], row['nb_obj'], random.randint(1,10)), axis=1).tolist()
4. 正确初始化Chromosome
现在就可以正常传入tester来创建Chromosome实例了:
f = Chromosome(tester)
如果你的DataFrame里的Gene数量不足20个,记得根据你的遗传算法逻辑补充默认Gene;如果数量超过20,就按需求截断即可。
内容的提问来源于stack exchange,提问作者funkyFunk
相关产品推荐
相关产品推荐

