使用 Pandas 在列之间进行样条插值时遇到问题

问题描述 投票:0回答:2

我有以下数据框

         index  Flux_min  New_Flux  Flux_max
0            0  0.550613       NaN  0.537315
1            1  0.656621       NaN  0.620647
2            2  0.756486       NaN  0.700822
3            3  0.846038       NaN  0.775749
4            4  0.920871       NaN  0.843257
...        ...       ...       ...       ...
99997    99997  0.874460       NaN  0.805594
99998    99998  0.801958       NaN  0.743039
99999    99999  0.721355       NaN  0.676436
100000  100000  0.635054       NaN  0.606967
100001  100001  0.552247       NaN  0.535789

我想要做的是在

Flux_min
Flux_max
列之间执行样条插值(或任何其他类型的非线性插值),以便找出
New_Flux
列的值。

这是我的代码来做到这一点

synth_spectra_df = synth_spectra_df.interpolate(method='spline', order=2, axis=1)

其中

synth_spectra_df
是上面显示的数据框。如果我运行此代码,我会收到以下错误:

Traceback (most recent call last):
  File "spectral_interpolation.py", line 107, in <module>
    synth_spectra_df = synth_spectra_df.interpolate(method='spline', order=2, axis=1)
  File "/home/fmendez/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py", line 7209, in interpolate
    raise ValueError(
ValueError: Index column must be numeric or datetime type when using spline method other than linear. Try setting a numeric or datetime index column before interpolating.

我已经确保所有列都是数字数据类型,并且也尝试不将索引作为列,但我仍然遇到相同的错误。如果我进行线性插值,它不会抱怨,但我对线性插值不感兴趣。

任何帮助将不胜感激

python pandas dataframe interpolation spline
2个回答
0
投票

为了进行插值,您需要在列中包含值。特别是,如果您阅读该方法的 documentation,您将看到一个示例,其中明确指出某个元素由于没有前面的条目而无法填充。

请注意“b”列中的第一个条目如何保持 NaN,因为它之前没有可用于插值的条目。

这来自文档:

df = pd.DataFrame([(0.0, np.nan, -1.0, 1.0),
                   (np.nan, 2.0, np.nan, np.nan),
                   (2.0, 3.0, np.nan, 9.0),
                   (np.nan, 4.0, -4.0, 16.0)],
                  columns=list('abcd'))
df
     a    b    c     d
0  0.0  NaN -1.0   1.0
1  NaN  2.0  NaN   NaN
2  2.0  3.0  NaN   9.0
3  NaN  4.0 -4.0  16.0
df.interpolate(method='linear', limit_direction='forward', axis=0)
     a    b    c     d
0  0.0  NaN -1.0   1.0
1  1.0  2.0 -2.0   5.0
2  2.0  3.0 -3.0   9.0
3  2.0  4.0 -4.0  16.0 

0
投票

您正在水平方向迭代,即列必须具有数字类型,但您有字符串:“Flux_min”,...

所以做类似的事情

df=synth_spectra_df
df.columns=np.linspace(0,3)
df.interpolate(method='spline', order=2, axis=1)

并将插值结果复制回synth_spectra_df

© www.soinside.com 2019 - 2024. All rights reserved.