
本文介绍如何对 dataframe 中两个等长列表列(如类别与对应分值)进行元素级配对,通过 explode 展开后透视聚合,高效计算每类的分值总和、正/负值频次等多维度统计指标。
本文介绍如何对 dataframe 中两个等长列表列(如类别与对应分值)进行元素级配对,通过 explode 展开后透视聚合,高效计算每类的分值总和、正/负值频次等多维度统计指标。
在实际数据分析中,常遇到将“类别列表”与“数值列表”按位置一一对应的需求(例如:每个商品有多个属性标签及其对应评分)。Pandas 原生不支持跨列同步展开列表,但可通过 explode() 的多列扩展能力(需 Pandas ≥ 1.3.0)结合 pivot_table() 实现优雅解耦。
以下为完整实现流程:
1. 构造示例数据
import pandas as pd
cat = [
['speed', 'health', 'strength', 'health'],
['strength', 'speed', 'speed'],
['strength', 'speed', 'health', 'speed']
]
pts = [
[1, 2, 1.5, -1],
[2, -1.5, 1.5],
[-1, 2, 0, 1.5]
]
df = pd.DataFrame({'cat': cat, 'pts': pts})
2. 同步展开两列并构建宽表 关键在于使用 explode(["cat", "pts"]) —— 它保证两列以相同索引顺序逐元素展开,确保类别与分值严格对齐:
# 同步展开,生成长格式记录 tmp = df.explode(['cat', 'pts']) # 自定义聚合函数:统计正/负值个数 def count_pos(x): return (x > 0).sum() def count_neg(x): return (x <p><strong>3. 合并回原表</strong></p><pre class="brush:php;toolbar:false;">result = pd.concat([df, pivot], axis=1) print(result)
✅ 输出结果与预期一致:每类生成 xxx_sum、xxx_pos、xxx_neg 三列,缺失类别自动填充 NaN(如第1行无 health 记录,对应列值为 NaN)。
⚠️ 注意事项:
- explode(['col1', 'col2']) 要求两列长度严格一致(否则抛出 ValueError),建议预先校验:df.apply(lambda r: len(r['cat']) == len(r['pts']), axis=1).all()
- 若需保留零计数(如 health_pos=0 而非 NaN),可在 pivot_table 中添加 fill_value=0
- 对于超大规模数据,explode 可能引发内存膨胀,可考虑分块处理或使用 itertools.chain + pd.concat 手动展开优化性能。
该方法兼具可读性与扩展性,轻松支持新增统计维度(如均值、标准差、最大值等),是处理嵌套列表关联分析的标准范式。










