按特定列对记录进行分组并插入缺失值
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分钟,但实际上有些记录丢失了,例如A
在01:50:00
和03:00:00
之间有一个信号跳跃,以及03:00:00
和 03: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
我有以下 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分钟,但实际上有些记录丢失了,例如A
在01:50:00
和03:00:00
之间有一个信号跳跃,以及03:00:00
和 03: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