为了账号安全,请及时绑定邮箱和手机立即绑定

使用 for 循环在另一个数据框中给定条件构建新数据框

使用 for 循环在另一个数据框中给定条件构建新数据框

浮云间 2021-08-24 18:31:39
这是我想要迭代的数据框。为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我想创建一个 for 循环,它返回一个像这样的数据帧:countries    change gini    change ef                                                                 Argentina    +              +Bolivia      -              +Chile        -              -countries 只是具有上一个数据框中的国家/地区名称的列。change gini应该是gini每个国家/地区列的最后一个值与最近一个值之间的百分比差异。如果百分比增加为正,则应显示+; 如果它是负的,那么它应该显示一个-.change ef遵循与change gini新数据框中相同的逻辑,唯一的区别是用于计算百分比变化的值来自ECONOMIC FREEDOM原始数据框中的列。
查看完整描述

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        +                +


查看完整回答
反对 回复 2021-08-24
?
慕盖茨4494581

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"])



查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信