2 回答
TA贡献1815条经验 获得超6个赞
您可以通过分组功能轻松实现这一点。
不幸的是,数据集中三个国家的第一个和最后一个值是相同的,因此结果也是相同的两个值的三倍。
(也许样本数据有问题?)
首先按国家/地区对数据框进行分组,然后只选择感兴趣的两列:
grpd = df.groupby('countries')['gini', 'ECONOMIC FREEDOM']
有了这个,Groupby-Object您可以将函数应用于由分组功能分隔的数据子集,countries在您的情况下。
例如,要获得每个组中的最后一个值,只需询问
grpd.last()
gini ECONOMIC FREEDOM
countries
Argentina 50.7 6.16
Bolivia 50.7 6.16
Chile 50.7 6.16
或相应地对于每组的第一行
grpd.first()
gini ECONOMIC FREEDOM
countries
Argentina 40.8 4.25
Bolivia 40.8 4.25
Chile 40.8 4.25
为了计算最后一个相对于第一个的变化百分比,你可以简单地写
(grpd.last() - grpd.first()) / grpd.first()
gini ECONOMIC FREEDOM
countries
Argentina 0.242647 0.449411
Bolivia 0.242647 0.449411
Chile 0.242647 0.449411
编辑:
输出也可以格式化,例如:
df_change = (grpd.last() - grpd.first()) / grpd.first()
df_change.applymap(lambda x: str.format('{:+.1f%}', x))
gini ECONOMIC FREEDOM
countries
Argentina +24.3% +44.9%
Bolivia +24.3% +44.9%
Chile +24.3% +44.9%
EDIT2:
仅用于标志:
df_change.applymap(lambda x: ['-', ' ', '+'][np.sign(x).astype(int)+1])
gini ECONOMIC FREEDOM
countries
Argentina + +
Bolivia + +
Chile + +
TA贡献1850条经验 获得超11个赞
创建空的列表,并追加所需的值countries,gini以及ECONOMIC FREEDOM每个国家列。
countries = []
gini = []
efw = []
for i in new_df.index.levels[0]:
countries.append(i)
country = new_df.loc[i]
country = country.reset_index()
x = country.iloc[0].tolist()
y = country.iloc[-1].tolist()
change_g = (((y[2] / x[2]) - 1) * 100)
change_e = (((y[3] / x[3]) - 1) * 100)
gini.append(change_g)
efw.append(change_e)
然后做一个for循环。对于每个数字,您附加一个+或一个-。
g = []
e = []
for n in gini:
if n > 0:
g.append("+")
g.append("-")
for f in efw:
if f > 0:
e.append("+")
e.append("-")
然后创建一个列出了数据帧countries,g和e。
tuples = list(zip(countries,g,e))
changes = pd.DataFrame(tuples, columns=['Country','Change in Gini', "Change in Economic Freedom"])
添加回答
举报