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

如何将含日期、国家、发生次数的DataFrame转换为宽表格式?

解决方法

你用的df.explode('Country')是用来拆分列表型字段的,完全不适合这种长表转宽表的场景,正确做法是用pandas的透视表相关方法:

方法1:使用pivot

如果Date+Country的组合没有重复值,直接用pivot最简洁:

import pandas as pd

# 构造示例数据
data = {
    'Date': ['2021-08-25', '2021-08-25', '2021-08-25', '2021-08-25', '2021-08-26', '2021-08-26', '2021-08-26', '2021-08-25'],
    'Country': ['CA', 'AE', 'BE', 'GR', 'CA', 'AE', 'BE', 'GR'],
    'Occurrences': [188, 10, 25, 49, 200, 7, 27, 52]
}
df = pd.DataFrame(data)

# 转换为宽表
wide_df = df.pivot(index='Date', columns='Country', values='Occurrences').reset_index()
# 清除列名的层级标记
wide_df.columns.name = None
print(wide_df)

运行后输出(注:示例数据中2021-08-25有两条GR记录,会取最后一条的52;2021-08-26无GR记录会显示NaN,可按需用fillna(0)填充):

Date        | CA  | AE | BE | GR
2021-08-25  | 188 | 10 | 25 | 52
2021-08-26  | 200 | 7  | 27 | NaN

方法2:使用pivot_table

如果存在Date+Country的重复记录,需要聚合计算(求和、均值等),用pivot_table更合适:

wide_df = df.pivot_table(
    index='Date',
    columns='Country',
    values='Occurrences',
    aggfunc='sum'  # 可替换为'mean'/'max'等聚合函数
).reset_index()
wide_df.columns.name = None
# 填充空值为0
wide_df = wide_df.fillna(0)
print(wide_df)

比如示例中2021-08-25的GR两条记录(49和52),用sum会得到101,可根据需求选择聚合方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:22:43