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

Python数据透视映射:将type值转为列头并填充en值

问题:将type字段值转为列标题并映射en字段值

原始数据

country start       type    en
US      8/1/2022    bb      10  
Japan   8/1/2022    aa      25  
Japan   9/1/2022    cc      1   

期望输出

country start       aa  bb  cc
US      8/1/2022    0   10  0
Japan   8/1/2022    25  0   0
Japan   9/1/2022    1   0   0

当前尝试代码

# pip install pyjanitor
import pandas as pd
import janitor

df.pivot(
    index = 'type', 
    names_to = ('start', '.value'), 
    names_pattern = r"(Q\d+)_?(.+)",
    sort_by_appearance = True)

解决方案

方法一:Pandas原生pivot_table

import pandas as pd

# 构造原始数据(实际使用时直接读取你的数据源即可)
data = {
    'country': ['US', 'Japan', 'Japan'],
    'start': ['8/1/2022', '8/1/2022', '9/1/2022'],
    'type': ['bb', 'aa', 'cc'],
    'en': [10, 25, 1]
}
df = pd.DataFrame(data)

# 执行转换
result = df.pivot_table(
    index=['country', 'start'],  # 保留作为行标识的字段
    columns='type',              # 转换为列标题的字段
    values='en',                 # 填充到新列的字段值
    fill_value=0,                # 缺失值填充为0
    aggfunc='sum'                # 处理重复索引的聚合方式,无重复时不影响结果
).reset_index()

# 移除列名的层级标签
result.columns.name = None

print(result)

方法二:使用PyJanitor的pivot_wider

import pandas as pd
import janitor

# 构造原始数据
data = {
    'country': ['US', 'Japan', 'Japan'],
    'start': ['8/1/2022', '8/1/2022', '9/1/2022'],
    'type': ['bb', 'aa', 'cc'],
    'en': [10, 25, 1]
}
df = pd.DataFrame(data)

# 执行转换
result = df.pivot_wider(
    index=['country', 'start'],
    names_from='type',
    values_from='en',
    fill_value=0
)

print(result)

错误说明

你之前的代码参数设置有误:

  • 错误将index设为type,实际需要保留的行标识是country和start
  • names_pattern使用的Q\d+正则与你的start字段格式不匹配,导致无法正确解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:10:30