我有以下数据框架:
OBJECTID 2017 2018 2019 2020 2021
1.0 NaN NaN 7569.183179 7738.162829 7907.142480
2.0 NaN NaN 766.591146 783.861122 801.131099
3.0 NaN NaN 8492.215747 8686.747704 8881.279662
4.0 NaN NaN 40760.327825 41196.877473 41633.427120
5.0 NaN NaN 6741.819674 6788.981231 6836.142788
我试图在每行上应用样条插值,以使用以下代码获得2017年和2018年的值:
years = list(range(2017,2022))
df[years] = df[years].interpolate(method="spline", order =1, limit_direction="both", axis=1)
然而,我得到以下错误:ValueError:当使用样条方法而不是线性方法时,索引列必须是数字或日期时间类型。在插入前尝试设置数字或日期时间索引列。
这个问题中的数据框只是我正在使用的更大数据集的一个子集。我所见过的所有例子都是沿着每一列进行样条插值,但我似乎不能让它在每一行都起作用。我觉得这是一个简单的解决方案,我只是错过了它。有人能帮帮我吗?
这似乎是因为索引的dtype
(实际上是axis=1
的列)在您的情况下可能是object
,因为索引也包含字符串列名。即使您抓取了仅包含整数年的列的一部分,但总体索引dtype
保持不变—object
。然后看起来interpolate
在看dtype
,当它看到object
的dtype
时,它就会放倒。
示例-即使年份以整数形式存储,总体dtype
为object
:
df.columns
Index(['OBJECTID', 2017, 2018, 2019, 2020, 2021], dtype='object')
如果我们这样做:
df.drop(columns=['OBJECTID'], inplace=True)
df.columns = df.columns.astype('uint64')
df.columns
UInt64Index([2017, 2018, 2019, 2020, 2021], dtype='uint64')
然后axis=1
插值工作:
years = list(range(2017,2022))
df[years] = df[years].interpolate(method="spline", order =1, limit_direction="both", axis=1)
2017 2018 2019 2020 2021
0 7231.223878 7400.203528 7569.183179 7738.162829 7907.142480
1 732.051193 749.321169 766.591146 783.861122 801.131099
2 8103.151832 8297.683789 8492.215747 8686.747704 8881.279662
3 39887.228530 40323.778178 40760.327825 41196.877473 41633.427120
4 6647.496560 6694.658117 6741.819674 6788.981231 6836.142788
删除OBJECTID
是为了说明发生了什么。