如何将含日期、国家、发生次数的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
相关产品推荐
相关产品推荐

