按行对数据帧进行样条插值
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
并在看到 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
是为了说明发生了什么。
我有以下数据框:
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
并在看到 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
是为了说明发生了什么。