python - 唯一值之间的线性插值 - Python
问题描述
我有一个 df 在重复的时间点包含多个值。我想插入两个特定列的值,但仅限于唯一时间点之间。使用下面的 df,我想插值X
并且Y
仅在唯一时间点之间。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Time' : ['09:00:00.1','09:00:00.1','09:00:00.2','09:00:00.2','09:00:00.3'],
'X' : [1,np.nan,np.nan,np.nan,3],
'Y' : [1,np.nan,np.nan,np.nan,3],
'A' : [5,np.nan,np.nan,np.nan,6],
'B' : [5,np.nan,np.nan,np.nan,6],
})
df1 = df.groupby('Time').apply(lambda x: x.interpolate(method='linear'))
注意:我不想要,
df[['X','Y']] = df[['X','Y']].interpolate(method = 'linear')
预期的输出是:
Time X Y A B
0 09:00:00.1 1.0 1.0 5.0 5.0
1 09:00:00.1 1.0 1.0 Nan NaN
2 09:00:00.2 2.0 2.0 NaN NaN
3 09:00:00.2 2.0 2.0 NaN NaN
4 09:00:00.3 3.0 3.0 6.0 6.0
解决方案
首先,我们drop_duplicates
基于Time
获取唯一行,然后使用这些值进行插值并更新原始数据框。
最后,我们使用ffill
转发填充我们的值:
interpolation = df.drop_duplicates('Time')[['X', 'Y']].interpolate()
df.loc[interpolation.index, ['X', 'Y']] = interpolation
df.loc[:, ['X', 'Y']] = df[['X', 'Y']].ffill()
Time X Y A B
0 09:00:00.1 1.00 1.00 5.00 5.00
1 09:00:00.1 1.00 1.00 nan nan
2 09:00:00.2 2.00 2.00 nan nan
3 09:00:00.2 2.00 2.00 nan nan
4 09:00:00.3 3.00 3.00 6.00 6.00
另一种方法是使用np.floor
,但这仅在您具有示例数据框中的场景时才有效(并且可能不是这种情况):
df[['X', 'Y']] = np.floor(df[['X', 'Y']].interpolate())
Time X Y A B
0 09:00:00.1 1.00 1.00 5.00 5.00
1 09:00:00.1 1.00 1.00 nan nan
2 09:00:00.2 2.00 2.00 nan nan
3 09:00:00.2 2.00 2.00 nan nan
4 09:00:00.3 3.00 3.00 6.00 6.00
推荐阅读
- java - 如何在 AWS CodeBuild 标准映像上安装不同的 Java OpenJDK 版本
- python - 如何更新存储在函数字段中的值,或者我们如何在 Odoo 8 中调用该方法?
- azure - 使用 Azure AD 作为身份提供者的 Azure ADB2C 单点注销
- javascript - 带有 Json 格式化程序的 JavaScript 中的树结构
- flutter - 如何使用 listview builder flutter 实现 ExpansionPanelList?
- pgadmin-4 - 没有在 postgres11 中创建程序
- excel - 使用 VBA 复制工作簿和过滤
- angular - 如何访问 Angular 中的管道结果以在不同的元素中使用?
- java - 使用 Querydsl 进行过滤操作
- arrays - Excel数组公式 - 以动态高度管理表格中的数据