
本文介绍如何对 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 < 0).sum()
# 多函数透视:按原始行索引分组,按类别列展开,对 pts 应用 sum/pos/neg
pivot = tmp.pivot_table(
index=tmp.index,
columns='cat',
values='pts',
aggfunc={'sum': 'sum', 'pos': count_pos, 'neg': count_neg}
)
# 重命名列:格式为 "{category}_{agg}"
pivot.columns = [f'{col[1]}_{col[0]}' for col in pivot.columns]3. 合并回原表
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 手动展开优化性能。
该方法兼具可读性与扩展性,轻松支持新增统计维度(如均值、标准差、最大值等),是处理嵌套列表关联分析的标准范式。

















