如何用统一符号(如下划线)扁平化Pandas DataFrame列层级?
解决Pandas多层级列DataFrame的扁平化问题
嗨,这事儿其实挺简单的,用Pandas自带的方法就能完美实现你要的效果。我先给你模拟出你描述的原DataFrame,再一步步教你怎么转成扁平化结构。
首先,先构造出符合你描述的带层级列的DataFrame:
import pandas as pd # 按照你说的数据构造原DataFrame data = [ [0, 0, 1, 1, 264], # id=264对应的A_a1、A_a2、B_b1、B_b2值 [1, 1, 2, 2, 321] # id=321对应的数值 ] # 创建多层级列索引 columns = pd.MultiIndex.from_tuples( [('A', 'a1'), ('A', 'a2'), ('B', 'b1'), ('B', 'b2'), ('id', '')], names=['Level1', 'Level2'] ) df = pd.DataFrame(data, columns=columns)
接下来就是核心的扁平化步骤,我们只需要处理列名,把层级用下划线连接起来,同时避免id列出现多余的下划线(因为它没有子列):
# 生成扁平化的列名:过滤空值后用下划线连接层级 flat_columns = ['_'.join(filter(None, col)) for col in df.columns] # 复制原DataFrame并替换列名 df_flat = df.copy() df_flat.columns = flat_columns
现在你可以打印df_flat看看结果,正好是你想要的结构:
A_a1 A_a2 B_b1 B_b2 id 0 0 0 1 1 264 1 1 1 2 2 321
简单解释一下:
filter(None, col)会把列元组里的空字符串过滤掉,所以id列的元组('id', '')会被处理成'id',而不是'id_'_'.join(...)把层级部分用下划线连接,正好生成你要的A_a1、B_b2这种格式- 数据完全保留了原有的对应关系,没有任何变化
内容的提问来源于stack exchange,提问作者Ladenkov Vladislav
相关产品推荐
相关产品推荐

