按特定列对记录进行分组并插入缺失值

Group records by specific column and interpolate missing values

我有以下 pandas DataFrame:

col1 col2                   col3        col4 
A    2021-03-28 01:40:00    1.381158    0.0
A    2021-03-28 01:50:00    0.480089    0.0
A    2021-03-28 03:00:00    0.111088    0.0
A    2021-03-28 03:10:00    0.000000    0.0
A    2021-03-28 03:20:00    0.000000    0.0
A    2021-03-28 03:40:00    0.151066    0.0
B    2021-03-28 03:00:00    1.231341    1.0
B    2021-03-28 03:20:00    1.334457    0.0
B    2021-03-28 03:30:00    1.123412    0.0

记录之间的间隔应该是10分钟,但实际上有些记录丢失了,例如A01:50:0003:00:00之间有一个信号跳跃,以及03:00:0003:20:00 之间 B.

我需要插入 col3 的缺失值,按 col1 分组,并使用线性插值。我试图让 df.interpolate(method='linear') 满足我的需要,但我不清楚如何考虑按 col1 分组。

这会让您到达可以插入列的位置

data = '''col1  col2                   col3        col4 
A    2021-03-28 01:40:00    1.381158    0.0
A    2021-03-28 01:50:00    0.480089    0.0
A    2021-03-28 03:00:00    0.111088    0.0
A    2021-03-28 03:10:00    0.000000    0.0
A    2021-03-28 03:20:00    0.000000    0.0
A    2021-03-28 03:40:00    0.151066    0.0
B    2021-03-28 03:00:00    1.231341    1.0
B    2021-03-28 03:20:00    1.334457    0.0
B    2021-03-28 03:30:00    1.123412    0.0'''
df = pd.read_csv(io.StringIO(data), sep=' \s+', engine='python')
df['col2'] = pd.to_datetime(df['col2'])
df.set_index('col2', inplace=True)
df = df.groupby('col1', as_index=False).resample('10min').last()
df['col1'].ffill(inplace=True)
df = df.reset_index().drop('level_0', axis=1).set_index('col1')

def interpolate_group(x):
    x['col3'] = x['col3'].interpolate(method='linear')  
    return x
    
df = df.groupby(df.index, as_index=False).apply(interpolate_group)
df.reset_index(inplace=True)
df

输出

   col1                col2  col3  col4
0     A 2021-03-28 01:40:00 1.381 0.000
1     A 2021-03-28 01:50:00 0.480 0.000
2     A 2021-03-28 02:00:00 0.427   NaN
3     A 2021-03-28 02:10:00 0.375   NaN
4     A 2021-03-28 02:20:00 0.322   NaN
5     A 2021-03-28 02:30:00 0.269   NaN
6     A 2021-03-28 02:40:00 0.217   NaN
7     A 2021-03-28 02:50:00 0.164   NaN
8     A 2021-03-28 03:00:00 0.111 0.000
9     A 2021-03-28 03:10:00 0.000 0.000
10    A 2021-03-28 03:20:00 0.000 0.000
11    A 2021-03-28 03:30:00 0.076   NaN
12    A 2021-03-28 03:40:00 0.151 0.000
13    B 2021-03-28 03:00:00 1.231 1.000
14    B 2021-03-28 03:10:00 1.283   NaN
15    B 2021-03-28 03:20:00 1.334 0.000
16    B 2021-03-28 03:30:00 1.123 0.000