如何解决AttributeError:在使用&in条件的情况下,“ float”对象没有属性“ 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年来的这一点,但是在这种情况下,我的功能不起作用,则最大值为300。
例如,如果我运行该结果,pop会减少0.1和0.01(pop2的年份是错误的):
find_year(data,100000000,0.1)
>>> 0.1
pop1 59
pop2 300
find_year(data,0.01)
>>> 0.01
pop1 119
pop2 300
为了修复它,我在函数中创建了条件来检查是否:
pop_size=init_poP*multiplier
位于原始df的其中一列之内,否则,不会将其添加到结果中。我尝试过这种方式:
def find_year(df,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',inplace=True)
return(s)
但是当我运行它时,我得到:
AttributeError:“浮动”对象没有属性“ 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
解决方法
由于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',inplace=True)
return s
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。