【问题标题】:Cant use numpy.ndarray or pandas groupby to create individual plots不能使用 numpy.ndarray 或 pandas groupby 来创建单独的图
【发布时间】:2018-04-22 05:12:28
【问题描述】:

我的目的是绘制大型数据集中每个位置 (ID) 的测量数据(var1、var2、Timestamp)。我的数据:

ID  var1    var2    TimeStamp
AA  2       5    8/8/2010 0:00
AA  2.5     5    1/1/2010 0:00
B7  1.1     7    1/9/2010 0:00
B7  2       6    1/8/2010 0:00
B7  3       7    1/1/2010 0:00
B7  3       6    1/9/2010 0:00
C0  4       7    1/8/1900 0:00
...

但是,如图所示,每个位置 ID 的数据(或行)数各不相同(通常在 3-30 之间变化) 要为每个位置绘制变量,我不确定如何进行: 从我目前所经历的情况来看,类似于以下内容:

np.array(data).reshape(500,20,15)

通过原始数据的 np.reshape 创建一个 numpy ndarray 不会让我将数组划分为单独的位置,因为数据的形状不规则。随后,使用 Pands groupby:

data_df.groupby('ID').plot('var1','var2')

立即为每个位置 ID 绘制 var1、var2 的图表,但没有机会迭代每个图表以创建标签/轴/限制等设置。(我还不知道如何迭代 pandas groupby 对象来创建和管理单个地块)

tldr:

有什么好方法可以根据标准(针对每个 ID)从不规则形状的数据(如上所示)创建np.ndarray

有什么方法可以迭代和控制 pandas dataframe.groupby 对象以绘制(不只是谈论汇总的平均值/最小值/最大值等)变量?

【问题讨论】:

标签: python pandas numpy matplotlib pandas-groupby


【解决方案1】:

使用pandas 绝对是处理此类数据的方法。

groupby().plot() 返回一个或多个 Axes 对象。你可以简单地迭代它们来改变它们的外观:

axs = data_df.groupby('ID').plot('var1','var2')
for ax in axs.values():
    ax.set_ylabel('whatever')
    ...

【讨论】:

  • 谢谢,但是 axs 是 pandas.core.series.Series 类型,您提到的 for 循环不会通过 for ax in axes: ax.set_ylabel('whatever') ... 迭代 Axes
  • 你是对的,axs 是 Series 类型,但你仍然可以迭代它的元素。我刚刚确认我编写的代码正在运行。如果它不适合您,您必须提供有关数据框格式的更多详细信息
  • 你也可以用iteritems()写循环:for ID,ax in axs.iteritems(): print(ID,ax)
  • 你说得对! for ID,ax in axs.iteritems(): print(ID,ax) 打印键和轴对象。但可能是我的经验不足,我仍然无法处理 for 循环中的 axs 和 ax 对象。或者你会建议在 matplotlib 部分提出一个新问题吗?我正在尝试这个:for ID, ax in axs: print(ID,ax) # just to see if the contents are okay ax.set_title ('title'+str(ID)) ax.set_xlabel('label') ax.set_ylabel('label') 它打印 id 和 obj,但后来说 TypeError: 'AxesSubplot' object is not iterable
  • 谢谢你,在你的指导下我终于想通了!
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 2016-12-28
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2021-11-06
相关资源
最近更新 更多