唯一值之间的线性插值 - Python
Linear interpolation between unique values - 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
我有一个 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