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

如何在R中重塑DataFrame:将步行计数器宽格式转长格式?

解决DataFrame宽表转长表的问题

问题场景

你有一个记录步行计数器小时数据的DataFrame,列对应不同计数器,行是每日每小时的计数,原始结构如下:

Date/time       counter1   counter2  counter3
1/1/2016 8:00      0           2        8
1/1/2016 9:00      1           0        3
1/1/2016 10:00     5           15       1

需要转换为长表结构,将计数器列转为counter_name和count两列,目标结构如下:

Date/time       counter_name       count
1/1/2016 8:00    counter 1           0 
1/1/2016 9:00    counter 1           1  
1/1/2016 10:00   counter 1           5
1/1/2016 8:00    counter 2           2
1/1/2016 9:00    counter 2           0
1/1/2016 10:00   counter 2           15
1/1/2016 8:00    counter 3           8
1/1/2016 9:00    counter 3           3
1/1/2016 10:00   counter 3           1

之前尝试转置未达到预期,且生成的行带不需要的名称。

解决方案

使用Pandas的melt()函数可以直接实现宽表转长表,同时处理列名格式:

代码实现

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'Date/time': ['1/1/2016 8:00', '1/1/2016 9:00', '1/1/2016 10:00'],
    'counter1': [0, 1, 5],
    'counter2': [2, 0, 15],
    'counter3': [8, 3, 1]
})

# 执行宽转长操作
melted_df = df.melt(
    id_vars=['Date/time'],  # 保留作为标识的列
    var_name='counter_name',  # 新生成的计数器名称列名
    value_name='count'  # 新生成的计数列名
)

# 处理counter_name格式:将counter1转为counter 1
melted_df['counter_name'] = melted_df['counter_name'].str.replace(r'(\D+)(\d+)', r'\1 \2', regex=True)

# 重置索引(去掉不需要的行名称)
melted_df = melted_df.reset_index(drop=True)

print(melted_df)

代码说明

  • melt()是Pandas专门用于宽表转长表的函数,id_vars指定不需要转换的列(这里是Date/time),var_name和value_name定义转换后的新列名。
  • 通过str.replace()正则替换,把counter1格式的列名改成counter 1。
  • reset_index(drop=True)去掉自动生成的索引行名称,符合需求。

输出结果

运行代码后会得到你需要的长表结构,无多余行名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:02:43