如何将pandas DatetimeIndex转为列适配Seaborn?附数组形状疑问
解决Seaborn无法识别DatetimeIndex及Series.values返回一维数组的问题
我来帮你搞定这两个问题,刚好日常处理时序数据时经常碰到类似情况:
1. 将DatetimeIndex提取为数据列
Seaborn的regplot()或lmplot()只能识别DataFrame的列,而你的dt是索引而非列,所以无法被调用。有两种简单的方法可以把索引转成列:
方法一:保留原索引同时新增列
直接把索引赋值给一个新列,这样原有的DatetimeIndex还能保留(方便后续时序操作):
# 新增dt列,值为原索引 df_08_09['dt'] = df_08_09.index
现在你再运行seaborn.regplot(x="dt", y="Global_active_power", data=df_08_09)就能正常识别dt列了。
方法二:重置索引并将索引转为列
如果不需要保留原索引,可以用reset_index(),它会把原索引转成列,同时将索引重置为默认的整数序列:
df_08_09 = df_08_09.reset_index()
这时候dt就成为普通的数据列,直接用于Seaborn绘图即可。
2. 为什么Series.values返回一维数组?
df_08_09.Global_active_power是一个pandas Series(一维数据结构),它的values属性返回的是一维numpy数组(形状为(n,))。如果想要得到形状为(n,1)的二维数组,你可以用以下几种方式:
方式一:用双层方括号选择列(转为DataFrame)
# 双层方括号会返回DataFrame而非Series arr = df_08_09[['Global_active_power']].values # 此时arr形状为(n,1)
方式二:将Series转为DataFrame后取values
arr = df_08_09.Global_active_power.to_frame().values
方式三:对一维数组进行reshape
arr = df_08_09.Global_active_power.values.reshape(-1, 1)
reshape(-1,1)中的-1表示自动计算行数,这样就能快速把一维数组转为单列的二维数组。
内容的提问来源于stack exchange,提问作者Rud Qertz
相关产品推荐
相关产品推荐

