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

时间:2018-11-22 00:50:56

标签: python pandas loops dataframe for-loop

这是我要遍历的数据框。为countriesyear都设置了索引。

                            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        -              -
  1. countries只是带有上一个数据框国家名称的列。

  2. change gini应该是每个国家gini列的最后一个值和最近一个国家之间的百分比差。如果百分比增加为正,则应显示+;如果是negativa,则应该显示-

  3. change ef遵循与新数据框中的change gini相同的逻辑,唯一的区别是用于计算百分比变化的值来自以下内容中的ECONOMIC FREEDOM列:原始数据框。

2 个答案:

答案 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)

创建一个空列表,并为每个国家/地区的countriesginiECONOMIC 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("-")

然后使用列表countriesge创建一个数据框。

tuples = list(zip(countries,g,e))
changes = pd.DataFrame(tuples, columns=['Country','Change in Gini', "Change in Economic Freedom"])