Python Pandas索引和计算行效率矢量化代码

Python Pandas索引和计算行效率矢量化代码,python,pandas,indexing,vectorization,Python,Pandas,Indexing,Vectorization,我对熊猫有些陌生,我觉得应该有一种更有效的方法来获得最小年和最大年的差异,所以改变,对于每个国家,而不是像我这样重复每个国家。我想把代码矢量化。也许这只是数据集的组织方式,但我一直在努力寻找矢量化的解决方案 有没有人有一个有效的想法,如何在不重复像我这样的国家的情况下运行它?我觉得应该有办法做到这一点。我在代码示例下面添加了一个数据集示例 new_columns = ['CountryName', 'Forest Area Change' ] dff = pd.DataFrame(columns

我对熊猫有些陌生,我觉得应该有一种更有效的方法来获得最小年和最大年的差异,所以改变,对于每个国家,而不是像我这样重复每个国家。我想把代码矢量化。也许这只是数据集的组织方式,但我一直在努力寻找矢量化的解决方案

有没有人有一个有效的想法,如何在不重复像我这样的国家的情况下运行它?我觉得应该有办法做到这一点。我在代码示例下面添加了一个数据集示例

new_columns = ['CountryName', 'Forest Area Change' ]
dff = pd.DataFrame(columns=new_columns) 

for country in countries:
    forest_area_1990 = df[(df.CountryName == country) & (df.IndicatorCode == 'AG.LND.FRST.ZS') & (df.Year == 1990)].Value.values
    forest_area_2015 = df[(df.CountryName == country) & (df.IndicatorCode == 'AG.LND.FRST.ZS') & (df.Year == 2015)].Value.values

    if forest_area_1990.size > 0 and forest_area_2015.size > 0:
        dff = dff.append({new_columns[0]:country, new_columns[1]: forest_area_2015[0] - forest_area_1990[0]}, ignore_index=True)
数据集如下所示:

            CountryName CountryCode                 IndicatorName   IndicatorCode  Year      Value  

11531340         Canada         CAN  Forest area (% of land area)  AG.LND.FRST.ZS  1990  38.299073  
21041940         Canada         CAN  Forest area (% of land area)  AG.LND.FRST.ZS  2015  38.166671  
11777751  United States         USA  Forest area (% of land area)  AG.LND.FRST.ZS  1990  33.022308  
21288351  United States         USA  Forest area (% of land area)  AG.LND.FRST.ZS  2015  33.899723  

我相信您正在寻找的是以下内容:

res = df[["CountryName", "Value"]].groupby("CountryName").agg(["first", "last"])
res.columns = ["first", "last"]
res["change"] = res["last"] - res["first"]
结果是:

                   first       last    change
CountryName                                  
Canada         38.299073  38.166671 -0.132402
United States  33.022308  33.899723  0.877415

最小年份和最大年份:您是指第一年和最后一年,还是任意两年之间的最大差异?您可以使用
df.pivot_表(索引=['CountryName'、'CountryCode'、'IndicatorName'、'IndicatorCode'],columns='year',values='Value')
,然后它应该像减去两列一样简单。(可以掩盖任何国家,你不关心的指标)谢谢,这正是我想要的。关于如何创建自定义agg的想法,以便最后一个和第一个年份是1990年和2015年,因为一些国家有1985年和2018年的数据,但我只希望25年的变化。我可以看到.agg可以使用lambda,但不确定如何访问“Years”,而.apply()可以创建一个自定义函数,该函数不能将列转换为Years,但不确定建议使用的是什么。否则,我可能不会。立即融入此数据帧格式,并执行@ALollz建议的操作。我只知道其他的图形对于我正在做的其他事情来说是很容易的。