如何将Pandas DataFrame列中的日期转换为新列?
解决方法:Pandas长表转宽表(日期转新列)
没问题!这在Pandas里是很常见的长表转宽表操作,用pivot()或pivot_table()就能轻松实现,我给你具体步骤和示例:
1. 先明确场景(模拟你的原始DataFrame)
假设左侧表格的结构是这样的(日期单独一列,还有分类列、数值列):
import pandas as pd # 模拟左侧的原始数据 df = pd.DataFrame({ "类别": ["产品A", "产品A", "产品B", "产品B"], "日期": ["2024-01-01", "2024-01-02", "2024-01-01", "2024-01-02"], "销售额": [1500, 2300, 900, 1800] })
2. 无重复数据时用pivot()
如果你的「分类列+日期」组合没有重复值(比如每个产品每天只有一条数据),直接用pivot()就能转成右侧的宽表样式:
# 核心转换代码 wide_df = df.pivot( index="类别", # 作为行的列(对应右侧表格的行标题) columns="日期", # 要转成新列的列(就是你的日期列) values="销售额" # 填充到新列里的数值内容 ).reset_index() # 清理列名的默认层级(让列名更干净) wide_df.columns.name = None
执行后得到的wide_df就是右侧表格的结构:「类别」作为第一列,每个日期作为单独的列,对应填充销售额数据。
3. 有重复数据时用pivot_table()
如果同一个分类在同一天有多条数据(比如同一个产品当天有多次销售记录),需要用pivot_table()配合聚合函数处理:
# 用求和聚合重复数据,也可以用mean、max等 wide_df = df.pivot_table( index="类别", columns="日期", values="销售额", aggfunc="sum" # 聚合方式,根据需求选sum/mean/max等 ).reset_index() wide_df.columns.name = None
4. 扩展:多数值列的情况
如果你的表格有多个数值列(比如同时有销售额、利润),可以一次性转换所有数值列:
# 模拟带多数值列的原始数据 df = pd.DataFrame({ "类别": ["产品A", "产品A", "产品B", "产品B"], "日期": ["2024-01-01", "2024-01-02", "2024-01-01", "2024-01-02"], "销售额": [1500, 2300, 900, 1800], "利润": [300, 460, 180, 360] }) # 转换多数值列 wide_df = df.pivot(index="类别", columns="日期", values=["销售额", "利润"]).reset_index() # 把多层列名扁平化(比如变成「销售额_2024-01-01」) wide_df.columns = ['_'.join(col).strip() for col in wide_df.columns.values]
内容的提问来源于stack exchange,提问作者yin
相关产品推荐
相关产品推荐

