如何扁平化聚合后的嵌套Pandas DataFrame列,设置为A、B_min、B_max
解决DataFrame聚合后嵌套列的扁平化问题
嘿,我来帮你搞定这个嵌套列的麻烦!聚合后出现多级嵌套列确实挺恼人的,这里给你两种简单规范的方法,直接把结构改成A、B_min、B_max的扁平形式:
方法一:聚合阶段直接指定列名(推荐)
这是最省心的方式——在聚合的时候就给每个聚合结果指定好列名,从根源上避免生成嵌套列。比如用groupby.agg()的时候,通过关键字参数直接定义列名和对应的聚合规则:
import pandas as pd # 先构造示例数据 data = {'A': [1,1,2,2], 'B': [10,20,5,15]} df = pd.DataFrame(data) # 一步到位生成扁平结构的DataFrame flat_df = df.groupby('A').agg( B_min=('B', 'min'), # 把B的最小值命名为B_min B_max=('B', 'max') # 把B的最大值命名为B_max ).reset_index() # 把分组的A从行索引转回普通列 print(flat_df.columns) # 输出:Index(['A', 'B_min', 'B_max'], dtype='object')
这种方法既规范又直观,完全不需要后续处理嵌套列。
方法二:处理已生成的嵌套多级列
如果已经得到了嵌套列的DataFrame,也可以快速把多级列扁平化。假设你的聚合结果是这样的多级列结构:
B min max A 1 10 20 2 5 15
你可以用两种方式处理:
方式1:合并多级列名
把多级列的层级用下划线拼接成单个列名,再把行索引转回列:
# 合并多级列的名称 agg_df.columns = ['_'.join(col) for col in agg_df.columns] # 把A从行索引转为普通列 flat_df = agg_df.reset_index()
方式2:直接重命名列
如果列的数量不多,直接手动指定新列名更直接:
# 先把A转回列 flat_df = agg_df.reset_index() # 直接替换列名 flat_df.columns = ['A', 'B_min', 'B_max']
为什么reindex_axis()和unstack()没用?
你之前试的这两个方法其实不对症:
reindex_axis()(现在已经被reindex()替代)是用来调整索引的顺序,不处理列的层级结构;unstack()是把行索引中的层级转成列,和你要扁平化列层级的需求不匹配。
内容的提问来源于stack exchange,提问作者Baron Yugovich
相关产品推荐
相关产品推荐

