You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中按作物筛选平均种植面积Top2的国家

问题:按作物分组筛选平均种植面积前2的国家数据

现有包含国家(Country)、作物(Crop)、收获年份(Harvest Year)、**种植面积(Area (ha))**字段的Pandas DataFrame:

Country Crop          Harvest Year  Area (ha)
Afghanistan Maize         2019          94910
Afghanistan Maize         2020          140498
Afghanistan Maize         2021          92144
Afghanistan Winter Wheat  2019          2334000
Afghanistan Winter Wheat  2020          2668000
Afghanistan Winter Wheat  2021          1833357
Argentina   Maize         2019          7232761
Argentina   Maize         2020          7730506
Argentina   Maize         2021          8146596
Argentina   Winter Wheat  2019          6050953
Argentina   Winter Wheat  2020          6729838
Argentina   Winter Wheat  2021          6394102
China       Maize         2019          41309740
China       Maize         2020          41292000
China       Maize         2021          43355859
China       Winter Wheat  2019          23732560
China       Winter Wheat  2020          23383000
China       Winter Wheat  2021          23571400
Ethiopia    Maize         2019          2274306
Ethiopia    Maize         2020          2363507
Ethiopia    Maize         2021          2530000
Ethiopia    Winter Wheat  2019          1789372
Ethiopia    Winter Wheat  2020          1829051
Ethiopia    Winter Wheat  2021          1950000
France      Maize         2019          1506100
France      Maize         2020          1691130
France      Maize         2021          1549520
France      Winter Wheat  2019          5244250
France      Winter Wheat  2020          4512420
France      Winter Wheat  2021          5276730
India       Maize         2019          9027130
India       Maize         2020          9569060
India       Maize         2021          9860000
India       Winter Wheat  2019          29318780
India       Winter Wheat  2020          31357020
India       Winter Wheat  2021          31610000
Namibia     Maize         2019          21123
Namibia     Maize         2020          35000
Namibia     Maize         2021          46070
Namibia     Winter Wheat  2019          1079
Namibia     Winter Wheat  2020          2000
Namibia     Winter Wheat  2021          3026

需求是按**作物(Crop)**分组,筛选每组内各收获年份种植面积平均值排名前2的国家。尝试以下代码未得到预期结果:

df = df.groupby("Crop", dropna=False).apply( lambda x: x.nlargest(2, "Area (ha)") )

预期输出为中国、印度的对应作物数据:

Country Crop          Harvest Year  Area (ha)
China   Maize         2019          41309740
China   Maize         2020          41292000
China   Maize         2021          43355859
China   Winter Wheat  2019          23732560
China   Winter Wheat  2020          23383000
China   Winter Wheat  2021          23571400
India   Maize         2019          9027130
India   Maize         2020          9569060
India   Maize         2021          9860000
India   Winter Wheat  2019          29318780
India   Winter Wheat  2020          31357020
India   Winter Wheat  2021          31610000

问题原因

你之前的代码直接对每组的单条记录取面积最大的2条,而不是先按国家计算平均面积再筛选前2的国家,所以结果不符合需求。

正确解决方案

import pandas as pd

# 1. 计算每个国家对应每种作物的平均种植面积
country_crop_avg = df.groupby(["Crop", "Country"])["Area (ha)"].mean().reset_index()

# 2. 按作物分组,筛选每组内平均面积排名前2的国家
top2_countries = country_crop_avg.groupby("Crop").apply(
    lambda group: group.nlargest(2, "Area (ha)")[["Country", "Crop"]]
).reset_index(drop=True)

# 3. 从原始数据中提取符合条件的所有记录
result = df.merge(top2_countries, on=["Country", "Crop"], how="inner")

# 可选:按作物、国家排序,与预期输出格式对齐
result = result.sort_values(["Crop", "Country"], ignore_index=True)
print(result)

代码说明

  1. 第一步先聚合得到每个国家-作物组合的平均种植面积,这是筛选的核心依据;
  2. 第二步在每个作物分组内,选出平均面积排名前2的国家;
  3. 最后通过合并操作,从原始DataFrame中提取这些国家的所有年份数据,得到预期结果。

内容的提问来源于stack exchange,提问作者user308827

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:54:52