AttributeError: 'float' object has no attribute 'isin' when using & in if condition
AttributeError: 'float' object has no attribute 'isin' when using & in if condition
我有 table 两个国家不同年份的人口规模,如下所示:
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
table 仅包含前 300 年的信息。
我正在尝试创建一个函数,该函数将告诉人口在哪一年有 decreased/increased 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' object has no attribute 'isin'
我也曾尝试将数字更改为整数,但我仍然遇到同样的错误,只是它说的不是“float”而是 int。
我不明白为什么会这样。
我的最终目标:添加条件,如果变量“pop_size”不在原始 table 的 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
您收到错误是因为 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
我有 table 两个国家不同年份的人口规模,如下所示:
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
table 仅包含前 300 年的信息。
我正在尝试创建一个函数,该函数将告诉人口在哪一年有 decreased/increased 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' object has no attribute 'isin'
我也曾尝试将数字更改为整数,但我仍然遇到同样的错误,只是它说的不是“float”而是 int。 我不明白为什么会这样。
我的最终目标:添加条件,如果变量“pop_size”不在原始 table 的 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
您收到错误是因为 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