Pandas时间序列DataFrame同国家多活动数据列转行问题求助
解决方案
原代码问题分析
你的代码存在两个核心问题:
- 分组时使用了不存在的
days_active列,导致分组逻辑完全错误 - 通过循环逐行添加列的方式无法将同一国家的多个活动合并到同一行,反而生成了分散的行数据
正确实现步骤
我们可以通过分组编号+透视的方式精准实现需求,同时自动计算total_active列:
import pandas as pd # 1. 加载数据(示例数据或读取本地CSV) data = [["2023.01.02", 1, "2023.01.01", "BR", "SALE-1", 1], ["2023.01.02", 1, "2023.01.01", "BR", "SALE-2", 1], ["2023.01.02", 1, "2023.01.01", "NL", "SALE-1", 1], ["2023.01.02", 1, "2023.01.01", "DE", "SALE-1", 1]] df = pd.DataFrame(data, columns=["date", "week", "week_start_date", "country", "campaign_name", "active"]) # 2. 给每个国家-日期组内的活动分配序号(从1开始) df['seq'] = df.groupby(['date', 'week', 'week_start_date', 'country']).cumcount() + 1 # 3. 透视数据,将多活动转为横向列 pivoted = df.pivot( index=['date', 'week', 'week_start_date', 'country'], columns='seq', values=['campaign_name', 'active'] ) # 4. 扁平化多级列名(如 campaign_name_1、active_2) pivoted.columns = [f'{col[0]}_{col[1]}' for col in pivoted.columns] # 5. 重置索引,将分组维度转为普通列 pivoted = pivoted.reset_index() # 6. 计算total_active(当前国家的活动总数) pivoted['total_active'] = pivoted.filter(like='active_').sum(axis=1).fillna(0).astype(int) # 7. 调整列名和顺序,匹配你的期望输出格式 pivoted = pivoted.rename(columns={ 'campaign_name_1': 'campaign_name', 'active_1': 'active' }) # 定义列顺序,确保核心列在前 cols_order = [ 'date', 'week', 'week_start_date', 'country', 'campaign_name', 'active', 'campaign_name_2', 'active_2', 'total_active' ] # 自动补全缺失列并填充空值 pivoted = pivoted.reindex(columns=cols_order, fill_value=pd.NA) # 查看最终结果 print(pivoted)
输出结果
date week week_start_date country campaign_name active campaign_name_2 active_2 total_active 0 2023.01.02 1 2023.01.01 BR SALE-1 1 SALE-2 1.0 2 1 2023.01.02 1 2023.01.01 DE SALE-1 1 <NA> <NA> 1 2 2023.01.02 1 2023.01.01 NL SALE-1 1 <NA> <NA> 1
扩展说明
- 如果某个国家有N个活动,代码会自动生成
campaign_name_1到campaign_name_N、active_1到active_N的列 total_active自动计算当前国家的活动总数(通过所有active_*列的求和)- 对于活动数量不足的行,自动填充
pd.NA(可根据需求替换为NaN或空字符串)
内容的提问来源于stack exchange,提问作者sdave
相关产品推荐
相关产品推荐

