You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas透视表替代分组操作实现DataFrame转换?

用Pandas透视表实现DataFrame维度转换

原始数据定义

import pandas as pd

df = pd.DataFrame({
    'barcode': ['b1', 'b2','b1','b2','b1', 'b2','b1','b2'],
    'library': ['l1', 'l1','l1','l1','l2', 'l2','l2','l2'],
    'sample': ['s1','s1','s2','s2','s1','s1','s2','s2'],
    'category': ['c1', 'c2','c1','c2','c1', 'c2','c1','c2'],
    'count': [10,21,13,54,51,16,67,88]
})

原始数据展示:

barcode library sample category  count
0      b1      l1     s1       c1     10
1      b2      l1     s1       c2     21
2      b1      l1     s2       c1     13
3      b2      l1     s2       c2     54
4      b1      l2     s1       c1     51
5      b2      l2     s1       c2     16
6      b1      l2     s2       c1     67
7      b2      l2     s2       c2     88

简洁实现方案:透视表转换

方法1:使用pivot(推荐,无重复索引场景)

# 拼接library和sample为目标列名格式
df['col_label'] = df['library'] + '_' + df['sample'] + '_count'

# 执行透视转换
result = df.pivot(
    index=['barcode', 'category'],
    columns='col_label',
    values='count'
).reset_index()

# 清理列名层级
result.columns.name = None

转换结果:

barcode category  l1_s1_count  l1_s2_count  l2_s1_count  l2_s2_count
0      b1       c1           10           13           51           67
1      b2       c2           21           54           16           88

方法2:使用pivot_table(支持重复索引聚合)

如果数据中存在barcode+category+library+sample的重复记录,可以通过指定聚合函数处理,当前场景下效果与pivot一致:

# 生成带层级列的透视表
result = df.pivot_table(
    index=['barcode', 'category'],
    columns=['library', 'sample'],
    values='count'
).reset_index()

# 将层级列名拼接为目标格式
result.columns = ['barcode', 'category'] + [f'{lib}_{sam}_count' for lib, sam in result.columns[2:]]

说明

两种方法都能替代原有的分组拼接逻辑,代码更简洁且性能更优,尤其是处理大规模数据时,透视表的向量化操作效率远高于循环/逐个分组提取。

内容的提问来源于stack exchange,提问作者NamAshena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:54:33