如何将Dataframe重塑为宽格式:按Status统计Mutation出现次数
问题描述
现有如下DataFrame:
import pandas as pd df = pd.DataFrame({'Status':['CO','AD','AD','AD','OT','CO','OT','AD'], 'Mutation':['H157Y','R47H','R47H','R67H','R62H','D87N','D39E','D39E']}) print(df)
输出:
Status Mutation 0 CO H157Y 1 AD R47H 2 AD R47H 3 AD R67H 4 OT R62H 5 CO D87N 6 OT D39E 7 AD D39E
需要将其转换为以Mutation值为列名、统计每个Status下对应突变出现次数的格式,最终结果如下:
df2 = pd.DataFrame({'Status':['CO','AD','OT'],'H157Y':[1,0,0],'R47H':[0,2,0],'R67H':[0,1,0], 'R62H':[0,0,1],'D87N':[1,0,0],'D39E':[1,0,1]}) print(df2)
输出:
Status H157Y R47H R67H R62H D87N D39E 0 CO 1 0 0 0 1 1 1 AD 0 2 1 0 0 0 2 OT 0 0 0 1 0 1
解决方案
可以通过两种简洁的方式实现需求:
方法1:使用pd.crosstab
pd.crosstab是pandas专门用于生成交叉统计表的函数,直接指定行、列和统计逻辑即可:
import pandas as pd df = pd.DataFrame({'Status':['CO','AD','AD','AD','OT','CO','OT','AD'], 'Mutation':['H157Y','R47H','R47H','R67H','R62H','D87N','D39E','D39E']}) # 生成交叉表,统计各Status下Mutation的出现次数 df2 = pd.crosstab(df['Status'], df['Mutation']).reset_index() # 移除列索引的默认名称(避免出现'Mutation'作为列名前缀) df2.columns.name = None print(df2)
方法2:使用pd.pivot_table
透视表同样可以实现分组统计,指定聚合函数为size(统计数量),并填充空值为0:
import pandas as pd df = pd.DataFrame({'Status':['CO','AD','AD','AD','OT','CO','OT','AD'], 'Mutation':['H157Y','R47H','R47H','R67H','R62H','D87N','D39E','D39E']}) # 构建透视表,按Status分组,Mutation为列,统计每组数量 df2 = df.pivot_table( index='Status', columns='Mutation', aggfunc='size', fill_value=0 ).reset_index() # 移除列索引名称 df2.columns.name = None print(df2)
两种方法最终都会输出符合要求的DataFrame。
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

