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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:20:47