按行对数据帧进行样条插值



我有以下数据框架:

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,当它看到objectdtype时,它就会放倒。

示例-即使年份以整数形式存储,总体dtypeobject:

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是为了说明发生了什么。

最新更新