【问题标题】:Pandas dataframe resample at every nth rowPandas 数据框每第 n 行重新采样一次
【发布时间】:2013-01-13 11:31:02
【问题描述】:

我有一个脚本,可以将系统日志文件读入 pandas 数据帧并从中生成图表。这些图表适用于小型数据集。但是当我面对更大的数据集时,由于数据收集时间较长,图表变得过于拥挤而无法辨别。

我计划重新采样数据帧,以便如果数据集通过一定大小,我将重新采样它,因此最终只有 SIZE_LIMIT 行数。这意味着我需要过滤数据帧,以便每个 n = actual_size/SIZE_LIMIT 行都会聚合到新数据帧中的一行。聚合可以是平均值,也可以是第 n 行。

我对 pandas 并不完全精通,所以可能错过了一些明显的方法。

【问题讨论】:

    标签: pandas


    【解决方案1】:

    您可以对索引使用pandas.qcut 方法将索引分成相等的分位数。您传递给qcut 的值可能是actual_size/SIZE_LIMIT

    In [1]: from pandas import *
    
    In [2]: df = DataFrame({'a':range(10000)})
    
    In [3]: df.head()
    
    Out[3]:
       a
    0  0
    1  1
    2  2
    3  3
    4  4
    

    在这里,按qcut(df.index,5) 对索引进行分组会产生 5 个同样分箱的组。然后我取每个组的平均值。

    In [4]: df.groupby(qcut(df.index,5)).mean()
    
    Out[4]:
                           a
    [0, 1999.8]        999.5
    (1999.8, 3999.6]  2999.5
    (3999.6, 5999.4]  4999.5
    (5999.4, 7999.2]  6999.5
    (7999.2, 9999]    8999.5
    

    【讨论】:

      【解决方案2】:

      其实我认为你不应该修改数据本身,而是要在想要的区间内查看数据进行绘图。此视图将是要绘制的实际数据点。

      例如,对于计算机屏幕,一种简单的方法是计算区间中有多少点,以及有多少像素可用。因此,为了在 1000 像素宽度的窗口中绘制一个具有 10000 个点的数据帧,您可以使用以下语法(对于示例来说,whole_data 将是一个一维数组),以 STEP 为 10 进行切片:

      data_to_plot = whole_data[::10]
      

      这可能会产生不良影响,特别是掩盖可能从切片操作中“逃脱不可见”的短峰。另一种方法是将您的数据拆分为箱,然后为每个箱计算一个数据点(例如最大值)。由于 numpy/pandas 高效的数组操作,我觉得这些操作实际上可能很快。

      希望这会有所帮助!

      【讨论】:

      • 谢谢它确实有帮助。我错过了明显的 [::n] 操作。我将尝试找到一个更优雅的分箱/聚合解决方案,但这种细化操作目前有效。
      • 如果你的趋势很慢并且没有太多的尖峰,通常简单的步进就足够了。我使用嘈杂的信号,简单的步进有时会产生很差的结果。我打算看看一些音频编辑程序的绘图引擎,它们具有非常快速的绘图仪导航,例如 Audacity。
      猜你喜欢
      • 2019-01-26
      • 2019-06-14
      • 2019-04-15
      • 2015-07-04
      • 2017-05-21
      • 1970-01-01
      • 2018-12-06
      • 2020-10-19
      • 1970-01-01
      相关资源
      最近更新 更多