首页 > 解决方案 > AttributeError: 'float' 对象在 if 条件中使用 & 时没有属性 'isin'

问题描述

我有两个国家在不同年份的人口规模表,如下所示:


   year   pop1          pop2
0   0   1.000000e+08    1.000000e+08
1   1   9.620000e+07    9.970000e+07
2   2   9.254440e+07    9.940090e+07
3   3   8.902771e+07    9.910270e+07
4   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.1
pop1    59
pop2    300



find_year(data,100000000,0.01)

>>>     0.01
pop1    119
pop2    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。我不明白为什么会这样。

我的最终目标:添加条件,如果变量“pop_size”不在原始表的 pop1 或 pop2 列中,它将从结果 df 中删除该行(表示需要 300 年)。

编辑:如何生成我的数据:

def growth(p,r,t):
    time=np.arange(0,t+1,1)
    res=[p]
    for t in time:
        p=p*r
        res.append(p)
    return(pd.DataFrame(list(zip(time, res)),columns =['year','pop']))
        
country1=growth(100000000,0.962,300)
country2=growth(100000000,0.997,300)

data=pd.concat([country1, country2['pop']],axis=1)
data.columns=['year','pop1','pop2']
data

标签: pythonpandasfunctionif-statementattributeerror

解决方案


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

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

推荐阅读