我有兩個國家不同年份的人口規(guī)模表,如下所示: 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 年的信息。我正在嘗試創(chuàng)建一個函數(shù)來判斷哪一年人口減少/增加了 2 倍、10 倍和 100 倍。在 jezrael 的幫助下,我創(chuàng)建了以下函數(shù):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 多年后達到這一點,但在這種情況下,我的函數(shù)不會工作并給出 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為了修復它,我在函數(shù)內創(chuàng)建了條件來檢查是否: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”我也嘗試將數(shù)字更改為整數(shù),但我仍然遇到相同的錯誤,只是它說的是 int,而不是“float”。我不明白為什么會發(fā)生這種情況。我的最終目標:添加條件,如果變量“pop_size”不在原始表的 pop1 或 pop2 列中,它將從結果 df 中刪除該行(這意味著需要 300 年)。
1 回答

元芳怎么了
TA貢獻1798條經驗 獲得超7個贊
您收到錯誤是因為既沒有屬性int也float沒有isin屬性。它是在 pandas 數(shù)據幀上定義的?,F(xiàn)在這里有一些可能可以解決您的問題:
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
添加回答
舉報
0/150
提交
取消