如何用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
相关产品推荐
相关产品推荐

