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

Spline interpolation on dataframes by row

我有以下数据框:

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:使用线性以外的样条方法时,索引列必须是数字或日期时间类型。尝试在插值之前设置数字或日期时间索引列。

这个问题中的数据框只是我正在使用的更大数据集的一个子集。我见过的所有 examples 都在每一列下进行样条插值,但我似乎无法让它在每一行上工作。我觉得这是一个简单的解决方案,我只是想念它。有人可以帮忙吗?

这似乎是因为索引的 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 是为了说明发生了什么。