Python 按年度作物序列分组,以检索英亩数和总和

Python 按年度作物序列分组,以检索英亩数和总和,python,pandas,Python,Pandas,熊猫还是新手,但渴望学习。我有大约8000块农田的作物序列,描述了每年出现的作物。我也有一份所有年份观测到的所有可能作物的主作物清单 对于每个“作物数量[YR]”,我想获得独特作物的频率,然后确定与独特作物类型相关的总面积(“英亩数”) 裁剪序列数据的虚拟示例: FieldID Acres CropSeq04 CropSeq05 CropSeq06 1 20 Barley Alfalfa Rye 2 30

熊猫还是新手,但渴望学习。我有大约8000块农田的作物序列,描述了每年出现的作物。我也有一份所有年份观测到的所有可能作物的主作物清单

对于每个“作物数量[YR]”,我想获得独特作物的频率,然后确定与独特作物类型相关的总面积(“英亩数”)

裁剪序列数据的虚拟示例:

FieldID   Acres    CropSeq04    CropSeq05   CropSeq06
1          20        Barley      Alfalfa      Rye
2          30        Barley        Rye        Rye
3          45       Lettuce      Alfalfa     Beets
4          10         Hay        Alfalfa      Rye
5          15       Alfalfa       Beets      Beets
我所设想的输出将是:

Crops04 Freq04  Acre04    Crops05   Freq05  Acre05    Crops06   Freq06  Acre06
Alfalfa   1       15      Alfalfa     3       75      Beets       2      60
Barley    2       50      Beets       1       15      Rye         3      60
Hay       1       10      Rye         1       30            
Lettuce   1       45
对于每种作物类型的英亩数和总和,我想将这些值添加到我的“主”序列列表中,以确保行值匹配。预计NA值或空白,因为每年并不总是包含所有可能的作物类型。主序列列表的一个示例:

MasterCropList  |  Crops04  Freq04  Acre04  |  Crops05  Freq05  Acre05  |  Crops06  Freq06  Acre06
Alfalfa         |  Alfalfa    1       15    |  Alfalfa    3       75    |       
Barley          |  Barley     2       50    |                           |
Beets           |                           |  Beets      1       15    |  Beets      2      60
Hay             |  Hay        1       10    |                           |
Rye             |                           |  Rye        1       30    |  Rye        3      60
Lettuce         |  Lettuce    1       45    |                           |
我已经能够获得独特作物的频率,并单独计算一年特定作物类型的英亩数。然而,同时做这两件事让我不知所措

面积汇总和排序示例:

# Sums Acres per crop sequence
year04 = cropdf.groupby('Crop04', as_index=False)['Acres'].sum()
year04.sort_values(by=['Acres'], ascending=False)
我将继续探索如何根据共享值将结果合并到主作物列表中。

使用:

new_df= ( 
       pd.concat([( group.add_suffix(i[-2:])
                         .rename(columns={'Crops':i})
                         .reset_index(drop=True) )

        for i,group in ( df.melt(['FieldID','Acres'],
                                 var_name='Seq',
                                 value_name='Crops')

                           .groupby(['Seq','Crops'])
                           .Acres
                           .agg(Freq='size',Acre='sum')
                           .unstack('Seq')
                           .reindex(index=df_master['MasterCropList']) 
                           .stack(dropna=False)
                           .swaplevel()
                           .sort_index()
                           .rename_axis(index=['Seq','Crops'])
                           .reset_index('Crops')
                           .assign(Crops=lambda x: x.Crops.where(x.Freq.notnull()))
                           .groupby(level=0) )],axis=1,sort=True)
)
df_master=( pd.concat([df_master.sort_values('MasterCropList')
                              .reset_index(drop=True),new_df],axis=1)
              .fillna('') )
print(df_master)
输出

  MasterCropList  Crops04 Freq04 Acre04  Crops05 Freq05 Acre05 Crops06 Freq06  \
0        Alfalfa  Alfalfa      1     15  Alfalfa      3     75                  
1         Barley   Barley      2     50                                         
2          Beets                           Beets      1     15   Beets      2   
3            Hay      Hay      1     10                                         
4        Lettuce  Lettuce      1     45                                         
5            Rye                             Rye      1     30     Rye      3   

  Acre06  
0         
1         
2     60  
3         
4         
5     60  

初始df_主数据

print(df_master)
  MasterCropList
0        Alfalfa
1         Barley
2          Beets
3            Hay
4            Rye
5        Lettuce

  • 如果所有
    MasterCropList
    值​​至少在
    df1
    的一列中,则不需要
    reindex
    ,并且
    重命名轴
    不需要

  • 请记住,此解决方案是灵活的,可用于许多CropSeq列。请注意,如果列数超过值99,则必须修改:
    。添加_后缀(i[-n::


谢谢你的指导。我确实在
.agg(Freq='size',Acre='sum')
遇到了一个错误。我收到了以下错误:
TypeError:aggregate()缺少一个必需的位置参数:“func\u或funcs”
。经过一些尝试和错误后,我发现
.agg({Freq':['size'],'Acre':['sum']))
尽管有人大喊大叫,但还是完成了任务,因为在一个系列中使用聚合和字典将被弃用。我喜欢分解代码。我不知道。melt()是一件事。我很乐意帮助:),尝试:
。agg(Freq=('Acres','size'),Acre=('Acres','sum')
。您使用的是
…acres.agg
?正确,我使用的是…
.acres.agg()
。我尝试了你的建议,但仍然得到一个位置参数缺失的错误。我真的很感谢你的帮助,向你致敬!