【问题标题】:Interpolating time series in Pandas using Cubic spline使用三次样条在 Pandas 中插值时间序列
【发布时间】:2012-12-18 19:46:25
【问题描述】:

我想使用三次样条填充我的 DataFrame 中的列中的空白。如果我要导出到列表,那么我可以使用 numpy 的 interp1d 函数并将其应用于缺失值。

有没有办法在 pandas 中使用这个函数?

【问题讨论】:

  • 我很惊讶你这么快就接受了答案(没有冒犯,海登;)因为我认为你特别想插入时间序列,但我猜你的意思并不完全是 pandas.TimeSeries。目前,我也对这些主题感兴趣。见stackoverflow.com/questions/13941472/…

标签: python pandas


【解决方案1】:

大多数 numpy/scipy 函数只要求参数是“array_like”,iterp1d 也不例外。幸运的是,Series 和 DataFrame 都是“array_like”,所以我们不需要离开 pandas:

import pandas as pd
import numpy as np
from scipy.interpolate import interp1d

df = pd.DataFrame([np.arange(1, 6), [1, 8, 27, np.nan, 125]]).T

In [5]: df
Out[5]: 
   0    1
0  1    1
1  2    8
2  3   27
3  4  NaN
4  5  125

df2 = df.dropna() # interpolate on the non nan
f = interp1d(df2[0], df2[1], kind='cubic')
#f(4) == array(63.9999999999992)

df[1] = df[0].apply(f)

In [10]: df
Out[10]: 
   0    1
0  1    1
1  2    8
2  3   27
3  4   64
4  5  125

注意:我想不出一个例子来将 DataFrame 传递给第二个参数 (y)...但这应该也可以工作。

【讨论】:

  • 啊。我懂了。如果 interp1d 函数中的 X 值是数据帧索引值,你会怎么做?
  • 您可以设置x = df.index,然后设置pd.Series(f(x), index=x)。 :)
  • 好的,感谢您的帮助!我希望的最后一件事。我有多个列,每个列都包含 NaN 数据。 Sol df.dropna() 删除了太多行。您如何将其仅应用于一列(即“data1”)
  • @user1911866 .dropna(subset=list_of_cols_to_drop)(见here)
  • 我很高兴我想出了与 hayden 建议的完全相同的方法:1. dropna,2. 使用 x = df.index 和 3. 创建 pd.Series(f(x ), 索引 = x)。我想我终于看到我的熊猫肌肉在增长.. ;)
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多