Pandas 使用列 'b' 前后单元格的平均值填充列 'a'
Pandas populate column 'a' using average of cells directly before and after in column 'b'
我有一个时间序列数据集,其中每隔一个时间间隔就缺少 GPS。
我希望使用 Pandas 直接使用数据间隙前后的 GPS 平均值来填充这些缺失值。
在下面的示例中,它会导致在 'timestamp' '06:41:59' 处填充 'AV_latitude' 和 'AV_longitude' 列,并直接使用前后位置的平均值。
如果 'AV' 列中的所有单元格都使用与我将使用 'fillna' 合并缺失数据值相同的方法填充,这不是问题。
如有任何帮助,我们将不胜感激!
Pandas 有一个方法来处理 NaN
值,.fillna
。在其他方法中,它支持“前向填充”和“后向填充”,将它们组合起来会得到想要的结果。
df[['lat', 'long']] = (
df[['lat', 'long']].fillna(method='ffill')
+ df[['lat', 'long']].fillna(method='backfill')
) / 2
作为奖励,这还将处理多个连续的 NaN
s
我不确定您真正想要的是 mean
还是您真正想要做的是对数据重新采样。一般来说,后者将是一项更常见的任务。这是我使用的输入数据:
df = pd.DataFrame({'timestamp': {0: '6/16/2020 6:41:58', 1: '6/16/2020 6:42:00'},'latitude': {0: -32.4353472, 1: -32.43535107}})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df
timestamp latitude
0 2020-06-16 06:41:58 -32.435347
1 2020-06-16 06:42:00 -32.435351
然后,对数据重新采样:
df = df.resample('s', on='timestamp').mean().reset_index()
df
输出:
timestamp latitude
0 2020-06-16 06:41:58 -32.435347
1 2020-06-16 06:41:59 NaN
2 2020-06-16 06:42:00 -32.435351
我有一个时间序列数据集,其中每隔一个时间间隔就缺少 GPS。
我希望使用 Pandas 直接使用数据间隙前后的 GPS 平均值来填充这些缺失值。
在下面的示例中,它会导致在 'timestamp' '06:41:59' 处填充 'AV_latitude' 和 'AV_longitude' 列,并直接使用前后位置的平均值。
如果 'AV' 列中的所有单元格都使用与我将使用 'fillna' 合并缺失数据值相同的方法填充,这不是问题。
如有任何帮助,我们将不胜感激!
Pandas 有一个方法来处理 NaN
值,.fillna
。在其他方法中,它支持“前向填充”和“后向填充”,将它们组合起来会得到想要的结果。
df[['lat', 'long']] = (
df[['lat', 'long']].fillna(method='ffill')
+ df[['lat', 'long']].fillna(method='backfill')
) / 2
作为奖励,这还将处理多个连续的 NaN
s
我不确定您真正想要的是 mean
还是您真正想要做的是对数据重新采样。一般来说,后者将是一项更常见的任务。这是我使用的输入数据:
df = pd.DataFrame({'timestamp': {0: '6/16/2020 6:41:58', 1: '6/16/2020 6:42:00'},'latitude': {0: -32.4353472, 1: -32.43535107}})
df['timestamp'] = pd.to_datetime(df['timestamp'])
df
timestamp latitude
0 2020-06-16 06:41:58 -32.435347
1 2020-06-16 06:42:00 -32.435351
然后,对数据重新采样:
df = df.resample('s', on='timestamp').mean().reset_index()
df
输出:
timestamp latitude
0 2020-06-16 06:41:58 -32.435347
1 2020-06-16 06:41:59 NaN
2 2020-06-16 06:42:00 -32.435351