如何基于DataFrame列与字典值实现分组统计?
分组统计需求:无需新增列的高效实现
现有数据
DataFrame(df)
Year Month Country Organizer Participation 2020 1 China FAO True 2020 1 Japan FAO True 2020 1 France EU False 2020 2 France FAO False 2020 2 Japan FAO True 2020 2 Germany EU True 2020 2 Finland EU False 2020 2 India FAO True 2020 3 Senegal FAO True
映射字典(codes)
codes = { 'Asia': ['China', 'Japan', 'India'], 'Europe': ['France', 'Germany', 'Finland'], 'Africa': ['Senegal'] }
需求
按Year、Month、Organizer字段,以及由Country通过codes映射得到的Continent进行分组,统计每组的行数(与Participation字段无关),期望输出:
Year Month Organizer Continent Number 2020 1 FAO Asia 2 2020 1 EU Europe 1 2020 2 FAO Europe 1 2020 2 FAO Asia 2 2020 2 EU Europe 2 2020 3 FAO Africa 1
要求:使用无需新增Continent列的简洁高效实现方式。
实现方案
可以先将codes反向生成为「国家→大洲」的映射字典,然后直接在groupby中使用这个映射进行分组,全程不需要新增列:
代码实现
# 反向生成国家到大洲的映射字典 country_to_continent = {country: continent for continent, countries in codes.items() for country in countries} # 直接分组统计,无需新增列 result = df.groupby( [ 'Year', 'Month', 'Organizer', df['Country'].map(country_to_continent).rename('Continent') # 直接在groupby中生成分组键并重命名 ] ).size().rename('Number').reset_index() print(result)
说明
- 反向映射字典
country_to_continent把每个国家对应到所属大洲,比原codes更适合直接做字段映射; - 在
groupby的参数里,直接对Country列做映射并将结果重命名为Continent,作为分组键之一; - 使用
size()统计每组行数,最后重命名为Number并重置索引,得到目标格式的结果。
这种方式避免了修改原DataFrame或新增中间列,逻辑紧凑且效率较高,尤其适合处理大规模数据时减少内存占用。
内容的提问来源于stack exchange,提问作者LJG
相关产品推荐
相关产品推荐

