首页 > 解决方案 > 如何扩展数据(插值?)

问题描述

我想通过插值(对吗?)数据来扩展数据帧中的列以匹配最长列的长度。

我不熟悉正确的术语,所以请更正我的词汇或告诉我如何更好地沟通。我相信pd.DataFrame.resample()答案是肯定的,但是在彻底查看文档之后,我还没有确定如何“扩展”一个专栏。

我有一个这样的数据框:

2000-01-01 00:00:00    0  0    0
2000-01-01 00:01:00    1  1    3
2000-01-01 00:02:00    2  2    5
2000-01-01 00:03:00    3  3    3
2000-01-01 00:04:00    4  nan  nan
2000-01-01 00:05:00    5  nan  nan
2000-01-01 00:06:00    6  nan  nan

我想“扩展”第二列,使其在时间上一样长,但不会丢失任何数据。执行所需的方法后,我希望数据如下所示:

2000-01-01 00:00:00    0  0    0
2000-01-01 00:01:00    1  0.5  1.5
2000-01-01 00:02:00    2  1    3
2000-01-01 00:03:00    3  1.5  4
2000-01-01 00:04:00    4  2    5
2000-01-01 00:05:00    5  2.5  4
2000-01-01 00:06:00    6  3    3

最终目标是平均每个索引上数据框中的所有列。如果有比“扩展”较短的列更简单的方法,请告诉我。我希望结果表如下所示:

2000-01-01 00:00:00    0  
2000-01-01 00:01:00    1
2000-01-01 00:02:00    2
2000-01-01 00:03:00    2.8333
2000-01-01 00:04:00    3.6667
2000-01-01 00:05:00    3.8333
2000-01-01 00:06:00    4

很多马哈洛:)

编辑:我通过添加第三列更改了我发布的原始数据。我意识到我的原始帖子并没有反映出我需要一个适用于任意增加和减少且独立于其他列的列的解决方案。

标签: pythonpandasdataframe

解决方案


数据df

                 time  col1  col2
0 2000-01-01 00:00:00     0   0.0
1 2000-01-01 00:01:00     1   1.0
2 2000-01-01 00:02:00     2   2.0
3 2000-01-01 00:03:00     3   3.0
4 2000-01-01 00:04:00     4   NaN
5 2000-01-01 00:05:00     5   NaN
6 2000-01-01 00:06:00     6   NaN

代码:

# get min/max values in col2
col2_min = df.col2.min()
col2_max = df.col2.max()

# restart col2 with min/max value only,
# and then interpolate values based on col1 values
df.col2 = np.nan
df.loc[df.col1.min(), 'col2'] = col2_min
df.loc[df.col1.max(), 'col2'] = col2_max
df.col2 = df.set_index('col1').col2.interpolate(method='index')
df['col3'] = (df.col1 + df.col2) / 2

输出:

                 time  col1  col2  col3
0 2000-01-01 00:00:00     0   0.0  0.00
1 2000-01-01 00:01:00     1   0.5  0.75
2 2000-01-01 00:02:00     2   1.0  1.50
3 2000-01-01 00:03:00     3   1.5  2.25
4 2000-01-01 00:04:00     4   2.0  3.00
5 2000-01-01 00:05:00     5   2.5  3.75
6 2000-01-01 00:06:00     6   3.0  4.50

我假设col2值与 成线性比例col1,因此首先确定minmax中的值col1col2尝试匹配它们。col2然后根据值插入col1值。


推荐阅读