You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:31:27