如何按ID合并DataFrame行并保留所有列(字符型数据)
按ID合并字符型DataFrame(保留原列结构)
针对你要按ID分组,将多行合并为一行且保留所有列的需求,核心逻辑是对每个分组内的列,只要存在YES就保留YES,否则留空,可以用Pandas的分组聚合实现:
步骤1:构造示例数据(和你的数据一致)
import pandas as pd df = pd.DataFrame({ 'ID': ['A001', 'A001', 'A002', 'A002', 'A002', 'A003'], 'thing_1': [pd.NA, 'YES', pd.NA, pd.NA, 'YES', pd.NA], 'thing_2': ['YES', pd.NA, pd.NA, 'YES', pd.NA, 'YES'], 'thing_3': [pd.NA, pd.NA, 'YES', pd.NA, 'YES', pd.NA] })
步骤2:分组聚合实现需求
方法一:自定义聚合函数(通用型,适用于列有多种非空值的情况)
# 按ID分组,对每个列提取非空值,有值则取唯一有效值,无值则留NA result = df.groupby('ID').agg( lambda x: x.dropna().unique()[0] if not x.dropna().empty else pd.NA ).reset_index()
方法二:用max()简化操作(仅适用于列只有YES和NA的场景)
因为Pandas对字符串列执行max()时会自动忽略NA,而YES是唯一的非空字符串,直接取最大值就能得到想要的结果:
result = df.groupby('ID').max().reset_index()
最终结果
执行后result的输出为:
| ID | thing_1 | thing_2 | thing_3 |
|---|---|---|---|
| A001 | YES | YES | |
| A002 | YES | YES | YES |
| A003 | YES |
内容的提问来源于stack exchange,提问作者Hawk McFadzen
相关产品推荐
相关产品推荐

