为了账号安全,请及时绑定邮箱和手机立即绑定

AttributeError:在 if 条件中使用 & 时,“float”对象没有属性“isin”

AttributeError:在 if 条件中使用 & 时,“float”对象没有属性“isin”

桃花长相依 2024-01-04 16:25:22
我有两个国家不同年份的人口规模表,如下所示:   year   pop1          pop20   0   1.000000e+08    1.000000e+081   1   9.620000e+07    9.970000e+072   2   9.254440e+07    9.940090e+073   3   8.902771e+07    9.910270e+074   4   8.564466e+07    9.880539e+07该表仅包含前 300 年的信息。我正在尝试创建一个函数来判断哪一年人口减少/增加了 2 倍、10 倍和 100 倍。在 jezrael 的帮助下,我创建了以下函数:def find_year(df,init_pop,multiplier):    pop_size=init_pop*multiplier    pop1_values=df['pop1'].unique().tolist()    pop2_values=df['pop2'].unique().tolist()       s=pd.DataFrame(df.set_index('year').sub(pop_size).abs().idxmin(),columns =[multiplier])   return(s)问题是每个种群的增长率是不同的,因此如果我检查人口何时减少 10 或 100,其中一个种群会在 300 多年后达到这一点,但在这种情况下,我的函数不会工作并给出 300 作为最大值。例如,如果我运行 pop 减少 0.1 和 0.01 的结果(pop2 同年,这是错误的):find_year(data,100000000,0.1)>>>     0.1pop1    59pop2    300find_year(data,100000000,0.01)>>>     0.01pop1    119pop2    300为了修复它,我在函数内创建了条件来检查是否:pop_size=init_pop*multiplier位于原始 df 的某一列内,如果不在,则不会将其添加到结果中。我尝试这样做:def find_year(df,init_pop,multiplier):    pop_size=init_pop*multiplier    pop1_values=df['pop1'].unique().tolist()    pop2_values=df['pop2'].unique().tolist()        if pop_size.isin(pop1_values) & pop_size.isin(pop2_values):                s=pd.DataFrame(df.set_index('year').sub(pop_size).abs().idxmin(),columns =[multiplier])        return(s)    elif pop_size.isin(pop1_values) & ~pop_size.isin(pop2_values):        s=pd.DataFrame(df.set_index('year').sub(pop_size).abs().idxmin(),columns =[multiplier])        s.drop('pop2',axis=0,inplace=True)        return(s)    elif pop_size.isin(pop2_values) & ~pop_size.isin(pop1_values):                s=pd.DataFrame(df.set_index('year').sub(pop_size).abs().idxmin(),columns =[multiplier])        s.drop('pop1',axis=0,inplace=True)        return(s)                但是当我运行它时我得到:AttributeError:“float”对象没有属性“isin”我也尝试将数字更改为整数,但我仍然遇到相同的错误,只是它说的是 int,而不是“float”。我不明白为什么会发生这种情况。我的最终目标:添加条件,如果变量“pop_size”不在原始表的 pop1 或 pop2 列中,它将从结果 df 中删除该行(这意味着需要 300 年)。
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

您收到错误是因为既没有属性int也float没有isin属性。它是在 pandas 数据帧上定义的。现在这里有一些可能可以解决您的问题:


def find_year(df, init_pop, multiplier):

    pop_size = init_pop*multiplier

    pop1_values = df['pop1'].unique().tolist()

    pop2_values = df['pop2'].unique().tolist()

    s = pd.DataFrame(df.set_index('year').sub(

        pop_size).abs().idxmin(), columns=[multiplier])


    if pop_size in pop1_values and not pop_size in pop2_values:

        s.drop('pop2', axis=0, inplace=True)

    elif pop_size in pop2_values and not pop_size in pop1_values:

        s.drop('pop1', axis=0, inplace=True)


    return s


查看完整回答
反对 回复 2024-01-04
  • 1 回答
  • 0 关注
  • 48 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信