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

