这是我要遍历的数据框。为countries
和year
都设置了索引。
ISO_code gini ECONOMIC FREEDOM rank quartile 1a_government_consumption
countries year
Argentina 1980 ARG 40.8 4.25 80.0 4.0 6.911765
1995 ARG 48.9 6.95 37.0 2.0 8.058824
2000 ARG 51.1 7.34 37.0 2.0 6.877627
2001 ARG 53.3 6.84 56.0 2.0 6.752473
2002 ARG 53.8 6.28 79.0 3.0 6.905961
2003 ARG 50.7 6.16 86.0 3.0 7.264992
Bolivia 1980 BOL 40.8 4.25 80.0 4.0 6.911765
1985 BOL 48.9 6.95 37.0 2.0 8.058824
1995 BOL 51.1 7.34 37.0 2.0 6.877627
2000 BOL 53.3 6.84 56.0 2.0 6.752473
2001 BOL 53.8 6.28 79.0 3.0 6.905961
2002 BOL 50.7 6.16 86.0 3.0 7.264992
Chile 1985 CHI 40.8 4.25 80.0 4.0 6.911765
1990 CHI 48.9 6.95 37.0 2.0 8.058824
1995 CHI 51.1 7.34 37.0 2.0 6.877627
1999 CHI 53.3 6.84 56.0 2.0 6.752473
2002 CHI 53.8 6.28 79.0 3.0 6.905961
2003 CHI 50.7 6.16 86.0 3.0 7.264992
我想创建一个for循环,该循环返回像这样的数据帧:
countries change gini change ef
Argentina + +
Bolivia - +
Chile - -
countries
只是带有上一个数据框国家名称的列。
change gini
应该是每个国家gini
列的最后一个值和最近一个国家之间的百分比差。如果百分比增加为正,则应显示+
;如果是negativa,则应该显示-
。
change ef
遵循与新数据框中的change gini
相同的逻辑,唯一的区别是用于计算百分比变化的值来自以下内容中的ECONOMIC FREEDOM
列:原始数据框。
答案 0 :(得分:1)
您可以通过分组功能轻松实现此目标。
不幸的是,数据集中这三个国家的第一个和最后一个值是相同的,因此结果也是两个相同值的三倍。
(也许示例数据有误吗?)
首先按国家/地区对数据框进行分组,然后仅选择感兴趣的两列:
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 + +
答案 1 :(得分:0)
创建一个空列表,并为每个国家/地区的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"])