我有一个包含每年特定国家人口的数据框和一个包含每年世界人口的 pandas 系列。 这是我正在使用的系列:
pop_tot = df3.groupby('Year')['population'].sum()
Year
1990 4.575442e+09
1991 4.659075e+09
1992 4.699921e+09
1993 4.795129e+09
1994 4.862547e+09
1995 4.949902e+09
... ...
2017 6.837429e+09
这是我正在使用的数据框
Country Year HDI population
0 Afghanistan 1990 NaN 1.22491e+07
1 Albania 1990 0.645 3.28654e+06
2 Algeria 1990 0.577 2.59124e+07
3 Andorra 1990 NaN 54509
4 Angola 1990 NaN 1.21714e+07
... ... ... ... ...
4096 Uzbekistan 2017 0.71 3.23872e+07
4097 Vanuatu 2017 0.603 276244
4098 Zambia 2017 0.588 1.70941e+07
4099 Zimbabwe 2017 0.535 1.65299e+07
我想计算每年该国家/地区的人口占世界人口的比例,因此我按如下方式循环访问 Series 和 DataFrame:
j = 0
for i in range(len(df3)):
if df3.iloc[i,1]==pop_tot.index[j]:
df3['pop_tot']=pop_tot[j] #Sanity check
df3['weighted']=df3['population']/pop_tot[j]
*df3.iloc[i,2]
else:
j=j+1
但是,我得到的返回的 DataFrame 不是预期的。我最终将所有值除以 2017 年的总人口,从而给出了当年不正确的比例(即,对于第一行,pop_tot 应该是 4.575442e+09,因为根据系列,它对应于 1990 年)以上,而不是对应于 2017 年的 6.837429e+09)。
Country Year HDI population pop_tot weighted
0 Albania 1990 0.645 3.28654e+06 6.837429e+09 0.000257158
1 Algeria 1990 0.577 2.59124e+07 6.837429e+09 0.00202753
2 Argentina 1990 0.704 3.27297e+07 6.837429e+09 0.00256096
但是我看不出循环中有什么错误。 提前致谢。
最佳答案
不需要循环,可以使用 groupby.transform
直接在 df3
中创建列 pop_tot
。然后对于列weighted
只需进行列操作,如:
df3['pop_tot'] = df3.groupby('Year')['population'].transform(sum)
df3['weighted'] = df3['population']/df3['pop_tot']
正如 @roganjosh 指出的那样,您的方法的问题在于,每次条件 if
时,您都会替换整个列 pop_tot
和 weighted
满足,因此在满足此条件的最后一次迭代中(年份可能是 2017 年),您将 pop_tot 列的值定义为 2017 年的值,并使用该值计算权重。
关于python - 循环只取最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55093651/