如何在Pandas DataFrame中固定起始列并转置指定列?
Pandas实现固定列转置日期列的解决方案
嘿,我懂你要做的事儿——把宽格式的DataFrame转成长格式,固定Type和Class这两列,把那些日期列拆成Date和Value对吧?你之前用pivot其实搞反方向啦,pivot是用来把长表转宽表的,而你需要的宽表转长表,Pandas里的melt函数刚好是干这个活的利器!
第一步:先还原你的输入DataFrame
先把你给出的示例数据用代码构造出来,方便你直接测试:
import pandas as pd # 构造输入的宽格式DataFrame data = { 'Type': ['Plant1', 'Plant2', 'Veg1', 'Veg2'], 'Class': ['Plant', 'Plant', 'Vegetable', 'Vegetable'], '24/01/2018': [5498, 3416, 5426, 5317], '25/01/2018': [5998, 4844, 5464, 4616], '26/01/2018': [5815, 4991, 3756, 7528] } df = pd.DataFrame(data)
第二步:用melt实现需求
直接调用pd.melt,参数设置非常直观:
# 使用melt转换格式 result_df = df.melt( id_vars=['Type', 'Class'], # 保持固定不转置的列 value_vars=['24/01/2018', '25/01/2018', '26/01/2018'], # 需要转置的日期列 var_name='Date', # 转置后日期列的名称 value_name='Value' # 转置后对应数值的列名称 )
如果你的日期列很多,不想手动列出来,可以用自动筛选的方式获取所有非固定列:
# 自动获取所有日期列(排除Type和Class) date_columns = df.columns.difference(['Type', 'Class']) result_df = df.melt( id_vars=['Type', 'Class'], value_vars=date_columns, var_name='Date', value_name='Value' )
最终输出结果
运行后得到的result_df就是你想要的格式:
Type Class Date Value 0 Plant1 Plant 24/01/2018 5498 1 Plant2 Plant 24/01/2018 3416 2 Veg1 Vegetable 24/01/2018 5426 3 Veg2 Vegetable 24/01/2018 5317 4 Plant1 Plant 25/01/2018 5998 5 Plant2 Plant 25/01/2018 4844 6 Veg1 Vegetable 25/01/2018 5464 7 Veg2 Vegetable 25/01/2018 4616 8 Plant1 Plant 26/01/2018 5815 9 Plant2 Plant 26/01/2018 4991 10 Veg1 Vegetable 26/01/2018 3756 11 Veg2 Vegetable 26/01/2018 7528
和你给出的期望输出完全一致,只是包含了所有行(你示例里只列了部分)。
原理简单说
melt的核心逻辑就是把宽表中指定的多列(这里是日期列)“融化”成两列:一列存储原来的列名(也就是日期),另一列存储对应的值,同时保留你指定的固定列(Type、Class),完美匹配你从Excel转过来的操作逻辑~
内容的提问来源于stack exchange,提问作者Shahrukh Khalidi
相关产品推荐
相关产品推荐

