【问题标题】:resampling pandas series with numeric index使用数字索引重新采样熊猫系列
【发布时间】:2014-04-06 09:54:18
【问题描述】:

假设我有一个带有数值类型索引的 pandas.Series,例如

pd.Series( [10,20], [1.1, 2.3] )

我们如何以 0.1 的间隔重新采样上述系列?看起来 .resample 函数仅适用于日期时间间隔?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    一种选择是使用 cut 来对这些数据进行分箱(远不如重采样优雅,但在这里):

    In [11]: cat, retbins = pd.cut(s.index, np.arange(1, 3, 0.1), retbins=True)
    
    In [12]: s.index = retbins[cat.labels]
    
    In [13]: s
    Out[13]: 
    1.0    10
    2.2    20
    dtype: int64
    

    如果你想用 how='sum' 重新采样:

    In [14]: s = s.groupby(s.index).sum()
    
    In [15]: s = s.reindex(retbins)
    

    现在有很多 NaN,您现在可以按照 Tom 的建议进行插值:

    In [16]: s.interpolate()
    

    【讨论】:

      【解决方案2】:

      这就是插值的名称。您可以将重采样视为插值的一种特殊情况。

      In [24]: new_idx = s.index + pd.Index(np.arange(1.1, 2.3, .01))
      
      In [25]: s.reindex(new_idx).interpolate().head()
      Out[25]: 
      1.10    10.000000
      1.11    10.083333
      1.12    10.166667
      1.13    10.250000
      1.14    10.333333
      dtype: float64
      
      In [26]: s.reindex(new_idx).interpolate().tail()
      Out[26]: 
      2.26    19.666667
      2.27    19.750000
      2.28    19.833333
      2.29    19.916667
      2.30    20.000000
      dtype: float64
      

      我们需要new_idx 是原始索引和我们想要插值的值的联合,这样原始索引就不会被删除。

      看看插值方法:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.interpolate.html

      【讨论】:

      • 我认为 2.3 在重新索引时被丢弃,因此结果没有增加......
      • 不错的收获。我应该仔细看看。关于reindex().interpolate() API 诗句s.reindex(at=new_idx) 的想法?最初主要是为了让df.interpolate() 更容易编写。无论哪种方式,我都可以看到论点。
      • @AndyHayden 和 tom:浮点数现在作为索引值是否可靠?
      • 现在Float64Index 支持它们。但仍有一些棘手的问题,所以我尽量避免它们。
      • 我认为使用 cut 更稳定,希望您/有人知道更好的方法!正如我们刚刚发现的那样,浮点数很复杂/敏感,但它们有时很有用......请小心处理。
      【解决方案3】:

      我不认为你可以有一个非整数索引,因为浮点比较操作。但是,对于 .1,您可以执行以下操作:

      • 创建一个新的df = pd.DataFrame(index=range(100, 201)) [现在将代表 .1]
      • 将 100(原为 10)和 200(原为 20)的值设置为 1.1 和 2.3
      • df.fillna(method='pad', inplace=True)

      另外,您似乎根本不需要使用索引,您只想要数据之间的差距......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 2023-04-01
        • 2021-06-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多