如何修改Pandas分组聚合后的多级列名并重置索引?
解决方案
要将Pandas的多级列索引转换为你期望的单级表头,只需遍历多级索引的元组,根据二级索引是否为空确定最终列名,步骤如下:
核心处理代码
# 转换多级列索引为单级 df.columns = [col[1] if col[1] else col[0] for col in df.columns] # 移除不需要的JoinTimes列(匹配你的期望样式) df = df.drop('JoinTimes', axis=1)
完整示例代码
import pandas as pd df = pd.DataFrame({"Attended":["Yes","Yes","Yes"] ,"Email":["009indrajeet","09871143420.ms","09s.bisht"] ,"JoinTime":["Dec 3, 2022 19:50:52","Dec 3, 2022 20:10:52","Dec 3, 2022 21:47:32"]}) # 转换为时间戳列 df['JoinTime'] = pd.to_datetime(df['JoinTime'],format='%b %d, %Y %H:%M:%S', errors='raise') # 提取日期 df['JoinDate'] = df['JoinTime'].dt.date # 分组 df_grp = df.groupby(["Attended","Email","JoinDate"]) # 聚合规则 dict_agg = {'JoinTime':[('JoinTimeFirst','min'),('JoinTimeLast','max'),('JoinTimes',set)]} # 执行聚合并重置索引 df = df_grp.agg(dict_agg).reset_index() # 处理表头 df.columns = [col[1] if col[1] else col[0] for col in df.columns] # 删除多余列 df = df.drop('JoinTimes', axis=1) # 查看结果 print(df)
说明
- 遍历MultiIndex的每个元组时,若二级索引(元组第二个元素)不为空,则使用该值作为列名;若为空字符串,则保留一级索引的名称。
- 由于聚合规则中生成了
JoinTimes列,但你的期望样式中不需要,因此用drop方法移除该列。
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

