我有两个国家不同年份的人口规模表,如下所示:
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,而不是“float”。我不明白为什么会发生这种情况。
我的最终目标:添加条件,如果变量“pop_size”不在原始表的 pop1 或 pop2 列中,它将从结果 df 中删除该行(这意味着需要 300 年)。
元芳怎么了
相关分类