最常见“降维”实为结构调整:用unstack()+reset_index(name=)展开MultiIndex为普通列;pd.melt()将宽表转长表,需指定id_vars等参数;explode()展开含列表的单列;嵌套结构展平需Python原生处理而非Pandas。

用 unstack() + reset_index() 把宽表变长表
这是最常见也最容易踩坑的“降维”场景:你有一张带多级列或行索引的 DataFrame(比如从 Excel 读入后调用 set_index().unstack()),结果得到一个 Series,且索引是 MultiIndex。这不是你要的“一维数组”,而是结构嵌套的二维视图。
关键不是“压平数字”,而是把嵌套索引展开成普通列:
-
unstack()后得到的是Series,其.index是MultiIndex,值在.values里 - 直接调
reset_index(name='value')就能把所有层级索引转为列,同时指定新值列名 - 别漏掉
name参数,否则新列默认叫0,容易混淆
示例:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
df = pd.DataFrame({'母件名称': ['A', 'A', 'B'], '日期': ['2023-01', '2023-02', '2023-01'], '数量': [10, 20, 30]})
temp = df.set_index(['母件名称', '日期'])['数量'].unstack(fill_value=0)
# → Series with MultiIndex: (母件名称, 日期)
result = temp.reset_index(name='FG_qty')用 pd.melt() 直接将宽格式转为长格式
如果你原始数据是“宽表”(列名是维度,如不同月份、不同产品线),而你想把它变成“一维记录流”(每行一个观测),pd.melt() 是最直白的选择,比手写 unstack 更可控。
立即学习“Python免费学习笔记(深入)”;
它不依赖索引,只靠明确指定:id_vars(保留为标识列)、value_vars(要“熔化”的列)、var_name 和 value_name(新列名):
- 漏设
id_vars会导致所有列都被当变量处理,结果错乱 -
value_vars不填时默认取除id_vars外所有列,但显式写出更安全 - 若原列名含空格或特殊字符,
pd.melt()仍能正常工作,无需预处理
示例:
df_wide = pd.DataFrame({'产品': ['X', 'Y'], 'Jan': [100, 200], 'Feb': [150, 210]})
df_long = pd.melt(df_wide, id_vars=['产品'], value_vars=['Jan', 'Feb'], var_name='月份', value_name='销量')对嵌套列表字段用 explode() 展开单列
当某列本身存的是 list、tuple 或其他可迭代对象(比如 API 返回的 JSON 中的数组字段),想把它“炸开”成多行,就该用 explode() —— 它是 Pandas 原生支持的真正“降维”操作,专治“一个单元格多个值”。
注意几个边界情况:
- 空列表或
None会被展开为NaN行,可用dropna(subset=[col])清理 - 不能直接对整个
DataFrame调用explode(),必须指定列名(支持传入列名列表) - 如果该列含字符串(如
"[1,2,3]"),得先用ast.literal_eval()转成真实 list,否则explode()会按字符拆
示例:
df = pd.DataFrame({'id': [1, 2], 'tags': [['a', 'b'], ['c']]})
exploded = df.explode('tags')别混淆“降维”和“扁平化嵌套结构”
很多人搜“Pandas 降维”,实际想要的是把 [[1,2],[3,[4,5]],6] 这种 Python 嵌套列表变成 [1,2,3,4,5,6]。但 Pandas 的 DataFrame 本身不提供通用嵌套结构递归展平能力 —— 它的设计目标是表格数据,不是树形结构。
这种需求必须回到 Python 原生层面解决:
- 用递归生成器(如知识库中的
flatten())先处理原始数据,再构造DataFrame - 若数据来自 JSON,优先用
pd.json_normalize()处理嵌套字典,而不是硬 flatten 列表 -
numpy.ndarray.flatten()只适用于规则多维数组,对不规则嵌套无效
真正容易被忽略的点是:Pandas 所谓“降维”,90% 指的是“结构调整”(宽→长、嵌套索引→普通列),而非数学意义上的维度压缩(如 PCA)。选错方法,就会在 apply(lambda x: ...) 里反复挣扎却得不到想要的结构。

















