使用Pandas将measure列按取值转换为Deaths和Prevalence两列
解决长表转宽表:将Deaths和Prevalence转为独立列
嘿,这是个非常常见的长格式DataFrame转宽格式的需求,用pandas的pivot()方法就能完美解决,我给你详细说明操作步骤:
核心代码实现
假设你的原始DataFrame变量名为df,直接用以下代码即可完成转换:
import pandas as pd # 执行转置操作 df_wide = df.pivot( index=['location', 'cause'], # 作为行唯一标识的列 columns='measure', # 要转为列的字段 values='val' # 填充新列的值来源 ).reset_index() # 移除列名上方的冗余标签,让结果更整洁 df_wide = df_wide.rename_axis(None, axis=1)
代码参数解释
index=['location', 'cause']:指定**州(location)+疾病类型(cause)**作为每行的唯一标识,确保每个组合只对应一行数据columns='measure':把measure字段的两个取值(Deaths、Prevalence)直接转换为两个独立的列values='val':用原表中val字段的数值,填充到新生成的Deaths和Prevalence列中reset_index():将原本作为索引的location和cause重新转为普通列,方便后续的筛选、分析操作rename_axis(None, axis=1):移除列名顶部的"measure"标签,让最终的DataFrame结构更清爽
转换后的示例结果
转换后你会得到这样的宽格式DataFrame:
| location | cause | Deaths | Prevalence |
|---|---|---|---|
| Alabama | sickness1 | 0.045 | 0.05 |
| Alabama | sickness2 | 0.001 | 0.003 |
| Alaska | sickness1 | ... | ... |
| ... | ... | ... | ... |
特殊情况处理(可选)
如果你的数据中存在同一个州+疾病+measure组合对应多个val值的情况(虽然你提到每个组合唯一,但还是提个醒),可以用pivot_table()配合聚合函数来处理,比如取第一个值或者平均值:
df_wide = pd.pivot_table( df, index=['location', 'cause'], columns='measure', values='val', aggfunc='first' # 或者用'mean'、'sum'等聚合方式 ).reset_index().rename_axis(None, axis=1)
内容的提问来源于stack exchange,提问作者Clemens
相关产品推荐
相关产品推荐

