如何用Pandas DataFrame内同event_num行填充缺失字段?
按event_num分组填充Pandas DataFrame缺失值
问题场景
现有如下Pandas DataFrame:
| index | event_num | recording_num | session_code | weather |
|---|---|---|---|---|
| 99378 | 11 | NaN | NaN | NaN |
| 99379 | 11 | 11 | P1 | clear |
| 99380 | 11 | NaN | NaN | NaN |
| 99381 | 4 | 4 | P2 | rain |
| 99382 | 37 | 37 | Q4 | wind |
| 99383 | 39 | 39 | Q5 | snow |
| 99384 | 4 | NaN | NaN | NaN |
需要将recording_num、session_code、weather列的缺失值,填充为对应event_num分组的有效值,最终得到:
| index | event_num | recording_num | session_code | weather |
|---|---|---|---|---|
| 99378 | 11 | 11 | P1 | clear |
| 99379 | 11 | 11 | P1 | clear |
| 99380 | 11 | 11 | P1 | clear |
| 99381 | 4 | 4 | P2 | rain |
| 99382 | 37 | 37 | Q4 | wind |
| 99383 | 39 | 39 | Q5 | snow |
| 99384 | 4 | 4 | P2 | rain |
单独使用my_df.ffill(axis=0)无法解决问题,因为该方法仅按行顺序从前到后填充,会错误地将前一个不同event_num的值填充到当前行(比如最后一行event_num=4会被填充为event_num=39的对应值)。
解决方案
方法一:组内前后填充组合
按event_num分组后,对目标列先执行向前填充(ffill)再执行向后填充(bfill),覆盖组内所有位置的缺失值:
import numpy as np import pandas as pd # 构建初始DataFrame data = { "index": np.arange(99378, 99385), "event_num": [11, 11, 11, 4, 37, 39, 4], "recording_num": [np.nan, 11, np.nan, 4, 37, 39, np.nan], "session_code": [np.nan, 'P1', np.nan, 'P2', 'Q4', 'Q5', np.nan], "weather": [np.nan, 'clear', np.nan, 'rain', 'wind', 'snow', np.nan] } my_df = pd.DataFrame(data) # 指定需要填充的列 fill_columns = ['recording_num', 'session_code', 'weather'] # 分组填充缺失值 my_df[fill_columns] = my_df.groupby('event_num')[fill_columns].transform( lambda x: x.ffill().bfill() ) print(my_df)
方法二:取组内第一个有效值填充整组
由于每个event_num分组内的有效值唯一,可直接提取组内第一个非缺失值,填充整组的缺失值:
my_df[fill_columns] = my_df.groupby('event_num')[fill_columns].transform( lambda x: x.dropna().iloc[0] )
两种方法都能得到目标结果,方法二更高效,适合每组有效值唯一的场景。
内容的提问来源于stack exchange,提问作者Sultan
相关产品推荐
相关产品推荐

