如何按ID和DATE分组且无需聚合函数合并DataFrame多行数据?
解决方案:按ID和DATE整合DataFrame非NA值
问题场景
现有如下结构的DataFrame:
| ID | DATE | VAL 1 | VAL 2 | VAL 3 | VAL 4 |
|---|---|---|---|---|---|
| ID1 | 2018-02-08 01:00:00 | 10 | NA | NA | NA |
| ID1 | 2018-02-08 01:00:00 | NA | 30 | NA | NA |
| ID1 | 2018-02-08 01:00:00 | NA | NA | 90 | NA |
| ID1 | 2018-02-08 01:00:00 | NA | NA | NA | 60 |
需要按ID和DATE分组,不使用聚合函数,将同组内各列的非NA值整合到同一行,得到如下结果:
| ID | DATE | VAL 1 | VAL 2 | VAL 3 | VAL 4 |
|---|---|---|---|---|---|
| ID1 | 2018-02-08 01:00:00 | 10 | 30 | 90 | 60 |
实现代码
可以通过分组后填充缺失值,再去重的方式实现:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ID': ['ID1']*4, 'DATE': ['2018-02-08 01:00:00']*4, 'VAL 1': [10, None, None, None], 'VAL 2': [None, 30, None, None], 'VAL 3': [None, None, 90, None], 'VAL 4': [None, None, None, 60] }) # 分组后向前填充缺失值,再保留每组唯一行 result = df.groupby(['ID', 'DATE']).ffill().drop_duplicates(subset=['ID', 'DATE'], keep='first') print(result)
也可以用向后填充搭配保留最后一行,效果一致:
result = df.groupby(['ID', 'DATE']).bfill().drop_duplicates(subset=['ID', 'DATE'], keep='last')
逻辑说明
groupby(['ID', 'DATE']):确保仅对同一ID和时间戳下的行进行处理ffill()/bfill():在分组内用非NA值填充缺失值,让同组的有效数据全部集中到一行drop_duplicates():删除分组后重复的行,只保留整合完成的单行数据
内容的提问来源于stack exchange,提问作者Seniker96
相关产品推荐
相关产品推荐

