如何将Pandas多级索引(年、月)合并为单个年月日期索引?
解决方案
方法一:直接用resample简化分组(推荐)
你当前的分组方式可以替换成resample('M'),这样分组后自动生成日期类型的索引,无需手动处理多级索引:
import random import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import os from scipy.stats import shapiro import scipy.stats as stats ios = pd.read_csv('iOS.csv') ios.replace(',','', regex=True, inplace=True) ios = ios.astype({'Total Impressions': int, 'App Referrer Impressions': int, 'Browse Impressions': int, 'Search Impressions': int, 'Total Installs': int, 'App Referrer Installs': int, 'Browse Installs': int, 'Search Installs': int, 'CVR': float, 'App Referrer CVR': float, 'Browse CVR': float, 'Search CVR': float}) ios['Date'] = pd.to_datetime(ios['Date']) # 设置Date为索引,按月份重采样取均值 ios = ios.set_index('Date').resample('M').mean()
resample('M')会按自然月分组,索引为每个月的最后一天(如2023-01-31),绘图时matplotlib会自动识别日期格式,显示成Jan 2023这类友好的年月刻度。
方法二:转换已有的多级索引
如果已经保留了原分组后的多级索引DataFrame,可通过以下代码将年、月索引合并为日期对象:
# 方式1:通过DataFrame构造日期 date_df = pd.DataFrame({ 'year': ios.index.get_level_values(0), 'month': ios.index.get_level_values(1) }) ios.index = pd.to_datetime(date_df) # 方式2:一行简洁写法 ios.index = pd.to_datetime(ios.index.map(lambda x: f'{x[0]}-{x[1]}'))
转换完成后,直接用seaborn或matplotlib绘制折线图即可,x轴会自动识别为日期类型:
plt.figure(figsize=(10,6)) sns.lineplot(data=ios, x=ios.index, y='Total Installs') plt.xlabel('年月') plt.ylabel('总安装量') plt.xticks(rotation=45) plt.show()
这样x轴刻度会显示为清晰的年月格式,满足绘图需求。
内容的提问来源于stack exchange,提问作者m. lekk
相关产品推荐
相关产品推荐

