如何将Pandas数据框对齐为面板以实现三维时序绘图?
嘿,这个需求我太熟悉了——处理多年份的同结构数据合并成面板,再做时间维度的可视化,其实步骤很清晰,我来给你拆解一下!
第一步:将多个DataFrame合并为面板数据
你有12个结构完全一致的DataFrame,最直接的方式是给每个数据框打上年份标签,再合并成一个大的DataFrame,这样后续不管是绘图还是分析都非常灵活。
方法一:手动添加年份列后合并
假设你的12个数据框分别命名为df_2015、df_2016……df_2026,可以这样操作:
import pandas as pd # 给每个数据框添加年份列 df_2015['year'] = 2015 df_2016['year'] = 2016 # ... 重复这个步骤到2026年的DataFrame # 合并所有数据框 panel_df = pd.concat([df_2015, df_2016, ..., df_2026], ignore_index=True)
方法二:用字典批量处理(更高效)
如果你的数据框已经按年份存在字典里(比如year_dfs = {2015: df_2015, 2016: df_2016, ...}),可以用列表推导式批量添加年份并合并:
panel_df = pd.concat( [df.assign(year=year) for year, df in year_dfs.items()], ignore_index=True )
进阶:用层次化索引(MultiIndex)
如果你更倾向于传统“面板数据”的结构,可以把年份设为行索引的一部分:
panel_multi = pd.concat( year_dfs.values(), keys=year_dfs.keys(), names=['year', 'original_index'] ) # 后续可以随时用panel_multi.reset_index()把year转回列
第二步:这种结构是否适合三维绘图?
完全适合!合并后的面板数据完美适配三维绘图的需求——你可以轻松提取年份(X轴)、犯罪类型(Y轴)、**数值列(比如案件数量,Z轴)**这三个维度的数据。
举个Matplotlib三维散点图的示例,展示每年不同犯罪类型的案件数量:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 把犯罪类型转换成数值(三维图的Y轴需要数值型数据) crime_cats = panel_df['Grave Crimes'].unique() crime_to_num = {cat: idx for idx, cat in enumerate(crime_cats)} panel_df['crime_num'] = panel_df['Grave Crimes'].map(crime_to_num) # 创建三维画布 fig = plt.figure(figsize=(10, 6)) ax = fig.add_subplot(111, projection='3d') # 绘制散点 ax.scatter( panel_df['year'], panel_df['crime_num'], panel_df['Cases Recorded'], s=50, c='blue', alpha=0.7 ) # 设置坐标轴标签 ax.set_xlabel('Year', fontsize=12) ax.set_ylabel('Crime Category', fontsize=12) ax.set_zlabel('Cases Recorded', fontsize=12) # 把Y轴的数值换回犯罪类型名称 ax.set_yticks(list(crime_to_num.values())) ax.set_yticklabels(list(crime_to_num.keys())) plt.title('Crime Cases Over Years (3D View)', fontsize=14) plt.show()
如果用Plotly这样的交互式库,合并后的面板数据也能快速生成可拖拽、缩放的三维图,体验更好。另外,这种结构也方便先做二维时间序列对比(比如每年各犯罪类型的折线图),再根据需求升级到三维可视化。
内容的提问来源于stack exchange,提问作者Indika Rajapaksha
相关产品推荐
相关产品推荐

