You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并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)

运行后得到的结果完全符合你的期望:

ABC
0whiteone1 2
1whiteone3 4 5
2whiteone6
3whiteone7

为什么之前的方法不行?

你之前用的df.groupby(np.arange(len(df))//2).sum()是固定每两行一组,属于静态分组,没法适配空行数量不固定的场景。而我们的方法是动态根据基准行的位置生成分组,不管空行是1个、多个还是没有,都能准确匹配到对应的前置基准行。

内容的提问来源于stack exchange,提问作者Submi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:25:31