pandas对datetime字段按年份执行groupby操作不生效问题求解
问题原因
- 对
groupby接口的作用认知有误:df.groupby('foundation')返回的是Pandas的GroupBy分组中间对象,仅存储了分组的映射规则,不会直接将原DataFrame的行按年份重排,也不会直接输出按分组整理好的结构化结果。你直接查看原始数据或者未做聚合的GroupBy对象,看到的还是原始行顺序,自然会觉得没有完成分组。 - 代码存在非核心的逻辑瑕疵:你给
foundation字段的空值填充为0,后续转datetime格式时,0会被识别为Unix时间戳起点,对应年份为1970,若你对空值有其他处理预期会产生脏数据,但这不是分组不生效的核心原因。
解决方法
根据你的实际需求选择对应方案即可:
场景1:仅需要将行按年份顺序排列,同一年的数据放在一起展示
不需要调用groupby,直接对字段排序即可:
# ascending=True为升序,改为False可切换为降序 df_sorted = df.sort_values('foundation', ascending=True).reset_index(drop=True) print(df_sorted)
场景2:需要按年份分组后做聚合统计(比如统计每年成立的公司数量、平均资产等)
需要在groupby后拼接聚合方法,才能得到分组后的统计结果:
# 示例:统计每年的公司数量 year_company_count = df.groupby('foundation')['name'].count().reset_index(name='company_count') print(year_company_count) # 示例:按年统计多个数值指标的平均值 year_stat = df.groupby('foundation').agg( avg_employee=('employee', 'mean'), avg_asset=('assets', 'mean'), avg_profit=('profit', 'mean') ).reset_index() print(year_stat) # 如果需要查看每个分组对应的所有原始数据,可遍历GroupBy对象 group_obj = df.groupby('foundation') for year, data_in_year in group_obj: print(f"年份{year}的公司数据:") print(data_in_year) print("-"*60)
注意:不要直接将原始DataFrame变量
df覆盖赋值为GroupBy对象,建议拆分变量存储,避免影响后续其他数据处理操作。
内容的提问来源于stack exchange,提问作者Ruslan Pylypiuk
相关产品推荐
相关产品推荐

