pandas如何将DataFrame列的NaN值替换为上一行单元格值
pandas DataFrame前向填充空值实现方案
核心方法说明
pandas内置的ffill()(forward fill)方法可直接实现「用上一行非空值填充当前空单元格」的需求,处理流程分三步:
- 先将所有pandas无法自动识别的无效值(空字符串、自定义空占位符等)统一替换为
pd.NA - 对需要补全的列执行前向填充
- 针对数据中日期错位存储的问题做额外清洗,得到规整数据集
具体实现代码
直接将以下逻辑追加到你现有代码的末尾即可:
# 1. 统一替换无效值为NaN,可根据实际数据里的无效占位符往列表中追加内容 df = df.replace(['', ' ', 'N/A', '--'], pd.NA) # 2. 提取错位存储在Name列的日期(匹配「三位月份缩写+空格+1-2位日期」的格式,比如Jun 15) df['Date'] = df['Name'].where(df['Name'].str.match(r'^[A-Z][a-z]{2} \d{1,2}$', na=False)) # 3. 对姓名、用户ID、日期三列执行前向填充,自动用上一行非空值补全空单元格 df[['Name', 'UserID', 'Date']] = df[['Name', 'UserID', 'Date']].ffill() # 4. 过滤掉无状态明细的员工汇总行、日期行,重置索引得到最终干净数据集 df_clean = df.dropna(subset=['Reason', 'PresenceState']).reset_index(drop=True)
处理后效果
最终输出的df_clean中,每一条状态明细都会匹配到对应的员工姓名、用户ID、日期,不存在空值,示例结构:
| Name | UserID | Reason | PresenceState | Total_Time | Date |
|---|---|---|---|---|---|
| Aguilar, Bertrand | 2653 | Unavailable - Break | Away | 00:09:03 | Jun 15 |
| Aguilar, Bertrand | 2653 | Unavailable - Lunch | Away | 00:32:07 | Jun 15 |
| Aguilar, Bertrand | 2653 | Work - Outbound | Busy | 00:00:00 | Jun 15 |
| Aguilar, Sarah | 2546 | Unavailable - Break | Away | 00:21:38 | Jun 15 |
| Aguilar, Sarah | 2546 | Unavailable - Lunch | Away | 00:30:00 | Jun 15 |
如果不需要提取单独日期列,也不需要过滤汇总行,直接执行
df = df.ffill()即可对全表所有列做前向填充,满足最基础的空值补全需求。
内容的提问来源于stack exchange,提问作者Eestrada
相关产品推荐
相关产品推荐

