如何在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)
代码说明
- 第一步先聚合得到每个国家-作物组合的平均种植面积,这是筛选的核心依据;
- 第二步在每个作物分组内,选出平均面积排名前2的国家;
- 最后通过合并操作,从原始DataFrame中提取这些国家的所有年份数据,得到预期结果。
内容的提问来源于stack exchange,提问作者user308827
相关产品推荐
相关产品推荐

