【问题标题】:In a DataFrame grouped by 2 fields, calculate difference between rows n and n-1 from 2nd grouping field inside the 1st grouping field在由 2 个字段分组的 DataFrame 中,从第一个分组字段内的第二个分组字段计算行 n 和 n-1 之间的差异
【发布时间】:2021-10-16 04:09:56
【问题描述】:

给定以下数据框(许多地区和年份的子集,每个地区的年份范围不同):

Area Year Food Aid (kg) Population Malnutrition Malnutrition rate (%)
Afghanistan 2013 128238 32269.589 8600.00000 26.65000
2014 57214 33370.79400 8800.00000 26.37000
Algeria 2013 35234 38140.13300 1300.00000 3.41000
2014 18980 38923.69200 1300.00000 3.34000
2015 17424 39728.02500 1300.00000 3.27000
2016 9476 40551.39200 1300.00000 ​ 3.21000

使用来自包含每个国家和每个可用年份的数据的数据集的 groupby 创建;然后添加计算行:

df.groupby(['Area', 'Year']).agg(
    {
        'Food Aid (kg)' : 'sum',
        'Population' : lambda x: x.iloc[0],
        'Malnutrition': lambda x: x.iloc[0]
    })

df['Malnutrition rate (%)'] = round(((df.loc[:,'Malnutrition'] / df.loc[:,'Population']))*100,2)

我想添加 2 个这样的聚合列。对于一个国家,给定第 N 年,自 N-1 年以来的进化百分比:

  • 食品援助
  • 营养不良

类似:

Area Year Food Aid (kg) Population Malnutrition Malnutrition rate (%) Food Aid evolution (%) Malnutrition rate evolution (%)
Afghanistan 2013 128238 32269.589 8600.00000 26.65000 --- ---
2014 57214 33370.79400 8800.00000 26.37000 -55.38 -1.051
Algeria 2013 35234 38140.13300 1300.00000 3.41000 --- ---
2014 18980 38923.69200 1300.00000 3.34000 -46.132 -2.053
2015 17424 39728.02500 1300.00000 3.27000 -8.198 -2.096
2016 9476 40551.39200 1300.00000 ​ 3.21000 -45.615 -1.835

我是 Pandas 的初学者。我已经尝试了几件事,但没有取得多大成功。例如,我不确定如何使用这个循环来使事情正常工作:

for key, value in df:
    # key is an array of grouped keys. Examples: (Afghanistan, 2013), (Afghanistan, 2014)
    # value is a Series of the various cols for the current row

问题:在由 2 个字段分组的数据框中:如何在第一个分组字段内添加一个包含第二个分组字段的行 n 和 n-1 之间的计算的新列?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用pct_change:

    new_cols = {'Food Aid (kg)': 'Food Aid evolution (%)',
                'Malnutrition rate (%)': 'Malnutrition rate evolution (%)'}
    
    out = df.join(df.groupby('Area')[['Food Aid (kg)', 'Malnutrition rate (%)']]
                    .pct_change().mul(100).rename(columns=new_cols))
    
    >>> out[new_cols.values()]
    
                      Food Aid evolution (%)  Malnutrition rate evolution (%)
    Area        Year
    Afghanistan 2013                     NaN                              NaN
                2014              -55.384519                        -1.050657
    Algeria     2013                     NaN                              NaN
                2014              -46.131577                        -2.052786
                2015               -8.198103                        -2.095808
                2016              -45.615243                        -1.834862
    

    【讨论】:

    • 直截了当的例子。谢谢!
    【解决方案2】:

    pct_change

    df.groupby(level=0).agg({'Food Aid (kg)': 'pct_change',
                             'Malnutrition rate (%)': 'pct_change'})*100
    
                 Food Aid (kg)  Malnutrition rate (%)
    Area                                             
    Afghanistan            NaN                    NaN
    Afghanistan     -55.384519              -1.050657
    Algeria                NaN                    NaN
    Algeria         -46.131577              -2.052786
    Algeria          -8.198103              -2.095808
    Algeria         -45.615243              -1.834862
    

    这假设您要比较的年份是有序且连续的

    【讨论】:

    • 哦,好的,谢谢,我应该看看聚合函数!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多