如何合并Pandas DataFrame中A、B列为空的相邻行至前一行?
解决Pandas空行合并到前置有效行的问题
这个需求的核心是给每个空行匹配到最近的、A/B列都非空的"基准行",然后将空行的C列内容合并到对应基准行的C列里。不管是单个空行、多个连续空行,还是基准行连续出现的场景,都可以通过动态生成分组键的方式完美解决,具体步骤如下:
步骤1:标记基准行
首先我们需要识别出所有A和B列都不为空的行,这些行就是后续空行要合并的目标:
import pandas as pd # 构造你更新后的测试数据 data = { 'A': ['white', '', 'white', '', '', 'white', 'white'], 'B': ['one', '', 'one', '', '', 'one', 'one'], 'C': ['1', '2', '3', '4', '5', '6', '7'] } df = pd.DataFrame(data) # 标记基准行(如果你的空值是NaN,就把 != '' 换成 notna()) is_benchmark = (df['A'] != '') & (df['B'] != '')
步骤2:生成动态分组键
通过对基准行标记做累加,我们可以给每个基准行和它后续的所有空行分配同一个分组ID:
# cumsum()会在基准行的位置累加1,减1是为了让分组ID从0开始 group_key = is_benchmark.cumsum() - 1
比如你的测试数据里,group_key会是[0,0,1,1,1,2,3],完美对应了每个行所属的目标组。
步骤3:分组聚合得到结果
最后对每个分组进行聚合:A和B列取组内第一个非空值(因为每个组里只有第一个行是基准行,后面都是空行),C列把所有值用空格连接起来:
result = df.groupby(group_key).agg( # 取组内第一个非空的A/B值 A=('A', lambda x: x[x != ''].iloc[0]), B=('B', lambda x: x[x != ''].iloc[0]), # 连接C列的所有内容 C=('C', ' '.join) ).reset_index(drop=True) print(result)
运行后得到的结果完全符合你的期望:
| A | B | C | |
|---|---|---|---|
| 0 | white | one | 1 2 |
| 1 | white | one | 3 4 5 |
| 2 | white | one | 6 |
| 3 | white | one | 7 |
为什么之前的方法不行?
你之前用的df.groupby(np.arange(len(df))//2).sum()是固定每两行一组,属于静态分组,没法适配空行数量不固定的场景。而我们的方法是动态根据基准行的位置生成分组,不管空行是1个、多个还是没有,都能准确匹配到对应的前置基准行。
内容的提问来源于stack exchange,提问作者Submi
相关产品推荐
相关产品推荐

