Python 按年度作物序列分组,以检索英亩数和总和
熊猫还是新手,但渴望学习。我有大约8000块农田的作物序列,描述了每年出现的作物。我也有一份所有年份观测到的所有可能作物的主作物清单 对于每个“作物数量[YR]”,我想获得独特作物的频率,然后确定与独特作物类型相关的总面积(“英亩数”) 裁剪序列数据的虚拟示例:Python 按年度作物序列分组,以检索英亩数和总和,python,pandas,Python,Pandas,熊猫还是新手,但渴望学习。我有大约8000块农田的作物序列,描述了每年出现的作物。我也有一份所有年份观测到的所有可能作物的主作物清单 对于每个“作物数量[YR]”,我想获得独特作物的频率,然后确定与独特作物类型相关的总面积(“英亩数”) 裁剪序列数据的虚拟示例: FieldID Acres CropSeq04 CropSeq05 CropSeq06 1 20 Barley Alfalfa Rye 2 30
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()
。我尝试了你的建议,但仍然得到一个位置参数缺失的错误。我真的很感谢你的帮助,向你致敬!