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

