首页 > 解决方案 > 在由 2 个字段分组的 DataFrame 中,从第一个分组字段内的第二个分组字段计算行 n 和 n-1 之间的差异

问题描述

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

区域 粮食援助(公斤) 人口 营养不良 营养不良率 (%)
阿富汗 2013 128238 32269.589 8600.00000 26.65000
2014 57214 33370.79400 8800.00000 26.37000
阿尔及利亚 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 ​</td> 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 以来的演变百分比:

就像是 :

区域 粮食援助(公斤) 人口 营养不良 营养不良率 (%) 粮食援助演变 (%) 营养不良率演变(%)
阿富汗 2013 128238 32269.589 8600.00000 26.65000 --- ---
2014 57214 33370.79400 8800.00000 26.37000 -55.38 -1.051
阿尔及利亚 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 ​</td> 3.21000 -45.615 -1.835

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

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 之间的计算的新列?

标签: pythonpandasdataframe

解决方案


看着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

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


推荐阅读