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

这是我想要迭代的数据框。为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原始数据框中的列。


浮云间
浏览 155回答 2
2回答

红糖糍粑

您可以通过分组功能轻松实现这一点。不幸的是,数据集中三个国家的第一个和最后一个值是相同的,因此结果也是相同的两个值的三倍。(也许样本数据有问题?)首先按国家/地区对数据框进行分组,然后只选择感兴趣的两列:grpd = df.groupby('countries')['gini', 'ECONOMIC FREEDOM']有了这个,Groupby-Object您可以将函数应用于由分组功能分隔的数据子集,countries在您的情况下。例如,要获得每个组中的最后一个值,只需询问grpd.last()           gini  ECONOMIC FREEDOMcountries                        Argentina  50.7              6.16Bolivia    50.7              6.16Chile      50.7              6.16或相应地对于每组的第一行grpd.first()           gini  ECONOMIC FREEDOMcountries                        Argentina  40.8              4.25Bolivia    40.8              4.25Chile      40.8              4.25为了计算最后一个相对于第一个的变化百分比,你可以简单地写(grpd.last() - grpd.first()) / grpd.first()                gini  ECONOMIC FREEDOMcountries                             Argentina  0.242647         0.449411Bolivia    0.242647         0.449411Chile      0.242647         0.449411编辑:输出也可以格式化,例如:df_change = (grpd.last() - grpd.first()) / grpd.first()df_change.applymap(lambda x: str.format('{:+.1f%}', x))             gini ECONOMIC FREEDOMcountries                         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 FREEDOMcountries                      Argentina    +                +Bolivia      +                +Chile        +                +

慕盖茨4494581

创建空的列表,并追加所需的值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"])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python