如何用Python基于渠道列值转置Web流量数据生成多时间序列
Python实现Web流量数据的宽表转换
我有一份分渠道的Web流量数据,原始格式如下:
day main_channel visits CR 11/2/2022 a 443645 1.248513488 11/2/2022 b 382870 3.441750617 11/2/2022 c 51249 0.315164766 11/1/2022 a 390267 2.725545677 11/1/2022 b 15361 0.478254073 11/1/2022 c 450734 1.513615502
需要将数据转置为以日期为唯一行标识,不同渠道的visits和CR作为独立列的格式,目标输出如下:
day a_visits b_visits c_visits a_CR b_CR c_CR 11/2/2022 443645 382870 51249 1.248513488 3.441750617 0.315164766 11/1/2022 390267 15361 450734 2.725545677 0.478254073 1.513615502
实现方法
使用Python的pandas库可以快速完成这个转换,以下是具体步骤:
1. 导入库并加载数据
先将原始数据加载为pandas的DataFrame,这里直接构造数据示例,你也可以用pd.read_csv()读取本地文件:
import pandas as pd # 构造原始数据 data = [ ["11/2/2022", "a", 443645, 1.248513488], ["11/2/2022", "b", 382870, 3.441750617], ["11/2/2022", "c", 51249, 0.315164766], ["11/1/2022", "a", 390267, 2.725545677], ["11/1/2022", "b", 15361, 0.478254073], ["11/1/2022", "c", 450734, 1.513615502] ] df = pd.DataFrame(data, columns=["day", "main_channel", "visits", "CR"])
2. 执行数据转置
用pivot方法指定索引、列和需要转换的字段,再调整列名格式:
# 执行pivot转换 pivoted_df = df.pivot(index="day", columns="main_channel", values=["visits", "CR"]) # 调整列名为「渠道_指标」的格式 pivoted_df.columns = [f"{col[1]}_{col[0]}" for col in pivoted_df.columns] # 重置索引,让day回到普通列 pivoted_df = pivoted_df.reset_index() # 按目标顺序整理列 target_columns = ["day", "a_visits", "b_visits", "c_visits", "a_CR", "b_CR", "c_CR"] pivoted_df = pivoted_df[target_columns] # 打印结果 print(pivoted_df)
3. 导出结果(可选)
如果需要将转换后的数据保存为文件,可以用to_csv()方法:
# 导出为制表符分隔的文本文件 pivoted_df.to_csv("transposed_traffic_data.txt", index=False, sep="\t")
处理重复数据的补充说明
如果原始数据存在同一天同一渠道的多条重复记录,改用pivot_table并指定聚合函数(如求和、均值)处理:
# 以求和为例处理重复数据 pivoted_df = df.pivot_table( index="day", columns="main_channel", values=["visits", "CR"], aggfunc="sum" )
内容的提问来源于stack exchange,提问作者sdave
相关产品推荐
相关产品推荐

